Ce problème est survenu dans un module que j'écris, mais j'ai fait un cas minimal qui présente le même comportement.Pourquoi le type d'inférence ne fonctionne-t-il pas ici?
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
}
Le problème est que le compilateur parvient à comprendre le paramètre intérieur pour Minimal
(Int
), mais définit alors l'autre occurrence de T
-Nothing
, ce qui ne correspond pas à l'évidence apply
. Ce sont certainement les mêmes T
, en supprimant le premier paramètre, le second se plaigne que T n'est pas défini.
Y at-il une certaine ambiguïté qui signifie que le compilateur ne peut pas déduire le premier paramètre, ou est-ce un bug? Puis-je travailler autour de cela avec élégance?
Informations supplémentaires: Ce code est un exemple simple de tentative de sucre syntaxique. Le code original essaie de faire |(a)|
signifie le module de a
, où a est un vecteur. Clairement |(a)|
est mieux que d'écrire |[Float,Vector3[Float]](a)|
, mais malheureusement, je ne peux pas utiliser unary_|
pour rendre cela plus facile.
L'erreur réelle:
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
Oui, cette solution fonctionne très bien dans mon cas. C'est aussi plus propre que la solution de Joshua (désolé Joshua!). Pouvez-vous expliquer pourquoi la solution de Joshua fonctionne, alors? – Dylan
Réponse mise à jour pour expliquer pourquoi la solution de Joshua fonctionne également. –