3.5.3 Conformidad débil en algunas situaciones Scala utiliza un relación más general de conformidad. Un tipo S débilmente ajusta a un tipo T, S escrito <: w T , si S <: T o ambos S y T son tipos de números primitivos y S precede T en el siguiente pedido.
- Byte <: w corto
- Byte <: w Carácter
- corto <: w Int
- Int <: w largo
- largo <: w Float
- Float <: w Doble
Un débil extremo superior es una cota menos superior con respecto a débil conformidad.
Cuando se utiliza esta? Por un lado, se determina el tipo de if
expresiones:
El tipo de la expresión condicional es la débil extremo superior (§3.5.3) de los tipos de e2 y e3
en Scala 2.7.x, esto sería por tipo de AnyVal
, el menos uppper límite de Int
y Double
. En 2.8.x, escribe como Double
.
scala> if (true) 1 else 1d
res0: Double = 1.0
mismo modo:
scala> try { 1 } catch { case _ => 1.0 }
res2: Double = 1.0
scala> (new {}: Any) match { case 1 => 1; case _ => 1.0 }
res6: Double = 1.0
scala> def pf[R](pf: PartialFunction[Any, R]): PartialFunction[Any, R] = pf
pf: [R](pf: PartialFunction[Any,R])PartialFunction[Any,R]
scala> pf { case 1 => 1; case _ => 1d }
res4: PartialFunction[Any,Double] = <function1>
Otro lugar que se utiliza es en la inferencia de tipos:
scala> def foo[A](a1: A, a2: A): A = a1
foo: [A](a1: A,a2: A)A
scala> foo(1, 1d)
res8: Double = 1.0
scala> def foos[A](as: A*): A = as.head
foos: [A](as: A*)A
scala> foos(1, 1d)
res9: Double = 1.0
Y también para la ampliación numérica sencilla:
Ampliación numérico. Si E tiene un primitivo tipo número que se ajusta débilmente (§3.5.3) para el tipo esperado, es ampliado para el tipo esperado usando uno de los 6,26 conversiones implícitas 97 métodos de conversión numéricos toShort, Tochar, Toint , a Largo, a Flotar, a Doble definido en §12.2.1. tipo esperado es primitivo tipo numérico Byte, Corto o Char, y la expresión e es un literal entero que se ajusta en el rango de ese tipo, se convierte al mismo literal en ese tipo.
scala> 1: Double
res10: Double = 1.0
ACTUALIZACIÓN
Como ha señalado Daniel, la especificación está mal acerca de los tipos tienen la conformidad débil. Preguntémosle al compilador:
scala> :power
** Power User mode enabled - BEEP BOOP **
** scala.tools.nsc._ has been imported **
** New vals! Try repl, global, power **
** New cmds! :help to discover them **
** New defs! Type power.<tab> to reveal **
scala> settings.maxPrintString = 10000
scala> import global.definitions._
import global.definitions._
scala> (for{c1 <- ScalaValueClasses;
c2 <- ScalaValueClasses
isNSC = isNumericSubClass(c1, c2)
if isNSC
} yield ("isNumericSubClass (%s, %s) = %b" format (c1, c2, isNSC))).mkString("\n")
res5: String =
isNumericSubClass (class Byte, class Byte) = true
isNumericSubClass (class Byte, class Short) = true
isNumericSubClass (class Byte, class Int) = true
isNumericSubClass (class Byte, class Long) = true
isNumericSubClass (class Byte, class Float) = true
isNumericSubClass (class Byte, class Double) = true
isNumericSubClass (class Short, class Short) = true
isNumericSubClass (class Short, class Int) = true
isNumericSubClass (class Short, class Long) = true
isNumericSubClass (class Short, class Float) = true
isNumericSubClass (class Short, class Double) = true
isNumericSubClass (class Int, class Int) = true
isNumericSubClass (class Int, class Long) = true
isNumericSubClass (class Int, class Float) = true
isNumericSubClass (class Int, class Double) = true
isNumericSubClass (class Long, class Long) = true
isNumericSubClass (class Long, class Float) = true
isNumericSubClass (class Long, class Double) = true
isNumericSubClass (class Char, class Int) = true
isNumericSubClass (class Char, class Long) = true
isNumericSubClass (class Char, class Char) = true
isNumericSubClass (class Char, class Float) = true
isNumericSubClass (class Char, class Double) = true
isNumericSubClass (class Float, class Float) = true
isNumericSubClass (class Float, class Double) = true
isNumericSubClass (class Double, class Double) = true
nota bene: https://lampsvn.epfl.ch/trac/scala/ticket/3594 – retronym