Este problema surgió en un módulo que estoy escribiendo, pero he hecho un caso mínimo que muestra el mismo comportamiento.¿Por qué no funciona aquí la inferencia?
class Minimal[T](x : T) {
def doSomething = x
}
object Sugar {
type S[T] = { def doSomething : T }
def apply[T, X <: S[T]] (x: X) = x.doSomething
}
object Error {
val a = new Minimal(4)
Sugar(a) // error: inferred [Nothing, Minimal[Int]] does not fit the bounds of apply
Sugar[Int, Minimal[Int]](a) // works as expected
}
El problema es que el compilador arregla para averiguar el parámetro interior para Minimal
(Int
), pero a continuación, establece la otra ocurrencia de T
-Nothing
, lo que obviamente no coincide apply
. Estos son definitivamente los mismos T
, ya que la eliminación del primer parámetro hace que el segundo se queje de que T no está definido.
¿Hay alguna ambigüedad que signifique que el compilador no puede inferir el primer parámetro o es un error? ¿Puedo solucionar esto con gracia?
Más información: Este código es un ejemplo simple de un intento de azúcar sintáctico. El código original intenta hacer que |(a)|
signifique el módulo de a
, donde a es un vector. Claramente |(a)|
es mejor que escribir |[Float,Vector3[Float]](a)|
, pero desafortunadamente no puedo usar unary_|
para hacerlo más fácil.
el error real:
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
Sí, esta solución funciona bien en mi caso. También es más limpio que la solución de Joshua (lo siento Joshua!). ¿Puedes explicar por qué la solución de Joshua funciona, entonces? – Dylan
Respuesta actualizada para dar una explicación de por qué la solución de Joshua también funciona. –