J'ai une méthode surchargée définie comme suit:
def g(f: () ⇒ Double): Object = null
def g(f: Double ⇒ Double): Object = null
def g(f: (Double, Double) ⇒ Double): Object = null
def h(f: (Double, Double) ⇒ Double): Object = null
Tandis que h(math.max _)
fonctionne comme prévu, appelant g(math.max _)
me donne l'erreur "La méthode surchargée ... ne peut pas être appliquée à ((Int, Int) => Int)". Il semble que le compilateur a choisi la version Int de math.max
au lieu de la version double.
Comment puis-je appeler ma méthode surchargée g
avec math.max en paramètre? Ce serait un bonus supplémentaire si je pouvais appeler g(math.max)
sans le soulignement.
Réponses:
3 pour la réponse № 1Vous avez rencontré une heuristique utilisée par le compilateurpour éviter des recherches de types exponentiellement complexes. Lorsque la méthode est surchargée, elle essaie de ne pas être ambiguë en fonction du type de l'argument. Malheureusement, l'argument est aussi surchargé. Au lieu d’essayer des possibilités, il saisit simplement le premier qui vient à l’esprit et cela ne fonctionne pas.
Vous pouvez le tromper en cherchant plus en demandant de la bonne façon:
g(math.max(_,_))
Notamment, il est maintenant clair pour le compilateur qu’il recherche un Function2
et que - même si toutes les versions de max
doit être Function2
! - est suffisant pour que le compilateur recherche une correspondance (et elle correspond à Double
avec Double
).
1 pour la réponse № 2
Quelques minutes après avoir posté ceci, j'ai découvert cette solution:
g(math.max: ((Double, Double) => Double))
Je suis toujours curieux de savoir pourquoi Scala a ce problème dans le premier cas.