Considere case class Foo[A, B <: List[A]](l: B) { ... }
o algo similar. En particular, A
y B
deben estar disponibles en algún lugar del cuerpo de Foo
.Tipo básico inferral
¿Es posible que el compilador infiera A
automáticamente? Por ejemplo, Foo(List(1,2,3))
falla ya que el verificador de tipos infiere A
como Nothing
. Tal vez hay una forma mediante el uso de miembros de tipo para resolver este problema?
que tienen que cierta sensación de que estoy pasando por alto algo embarazosamente simple aquí;)
EDIT: Me acabo de enterar que el uso de otro tipo de parámetro X
funciona bien, pero atm No entiendo por qué es Entonces:
scala> case class Bar[A, B[X] <: List[X]](l: B[A])
defined class Bar
scala> Bar(List(1,2,3))
res11: Bar[Int,List] = Bar(List(1, 2, 3))
¿Alguien me puede explicar esto? ¿Es esto un problema de unificación?
EDIT 2: Usar [A, B[X] <: List[X]](l: B[A])
puede tener implicaciones no deseadas para ciertas jerarquías (aunque no es realmente un gran problema). Más interesante, acabo de tropezar con un blog post de Josh Suereth que muestra implícitamente que [A, B <: List[A]](l: B with List[A])
funciona igual de bien ... No hay necesidad de implícitos, etc.
¿Se puede definir la clase como 'case class Foo [A] (l: List [A])'? Eso podría ser más claro. – leedm777
Entiendo lo que quiere decir, pero eso no es aplicable en mi caso. Tanto el tipo A como el B deben conocerse aparte el uno del otro. – fotNelton