(Véase también dos preguntas relacionadas: Scala fails to infer the right type arguments y Type infered to Nothing in Scala)
se ve como una limitación de la inferencia de tipos de Scala, que intencionadamente no se spec'ed. Como solución alternativa, puede obtener la inferencia haciendo T
un miembro de tipo de B
en lugar de los parámetros,
abstract class A
abstract class B { type T <: A }
class ConcreteA extends A
class ConcreteB extends B { type T = ConcreteA }
class Example[U <: B](resolver: U)
object Test {
new Example(new ConcreteB)
}
Al usar miembros de tipo, es útil saber que pueden estar recubiertos según los parámetros de tipo utilizando el refinamiento, como en la respuesta de Miles Sabin a: Why is this cyclic reference with a type projection illegal?
En la respuesta de Jean-Philippe Pellet al a related question, la inferencia tipo fue ayudada haciendo que el parámetro tipo sea más alto. Si introduce un parámetro de tipo adicional en ConcreteB
, a continuación, escriba la inferencia puede trabajar,
abstract class A
abstract class B[T <: A]
class ConcreteA extends A
class ConcreteB[T <: A] extends B[T]
class Example[T <: A, U[T0 <: A] <: B[T0]](resolver: U[T])
object Test {
new Example(new ConcreteB[ConcreteA])
}
Scala 2.9 da el mensaje de error misteriosa abajo, pero Miles Sabin señala que es un error que se fija por 2,9. 1
<console>:15: error: kinds of the type arguments (ConcreteA,ConcreteB[T0]) do not conform to the expected kinds of the type parameters (type T,type U) in class Example.
ConcreteB[T0]'s type parameters do not match type U's expected parameters: class ConcreteB has one type parameter, but type U has one
new Example(new ConcreteB[ConcreteA])
^
posible duplicado de [Type infered to Nothing in Scala] (http://stackoverflow.com/questions/6888136/type-infered-to-nothing-in-scala) –
Es similar, pero la respuesta aceptada a eso la pregunta no se aplica en este caso. –