Wie kann ich erzwingen, dass trickyMethod
die Argumente zur Kompilierzeit gleich sind, aber zur gleichen Zeit auch die gemeinsame Super haben geben Sie Fruit
ein?Scala Puzzle: Erzwingen, dass zwei Funktionsargumente vom gleichen Typ sind und beide sind ein Subtyp einer gegebenen Klasse
Also mit anderen Worten, tricky.trickyMethod(new Banana,new Apple)
sollte nicht kompilieren.
Ich bin sicher, es muss eine einfache Lösung sein, aber ich habe nur 1 Stunde nach der Antwort gesucht und habe noch keine Ahnung :(
Ich versuchte impliziten Beweis mit <: < aber ich konnte es nicht an der Arbeit
class Fruit
class Apple extends Fruit
class Banana extends Fruit
class TrickyClass[T<:Fruit]{
def trickyMethod(p1:T,p2:T)= println("I am tricky to solve!")
}
object TypeInferenceQuestion extends App{
val tricky=new TrickyClass[Fruit]()
tricky.trickyMethod(new Apple,new Apple) //this should be OK
tricky.trickyMethod(new Banana,new Banana) //this should be OK
tricky.trickyMethod(new Banana,new Apple) //this should NOT compile
}
EDIT:.!
Vielen Dank für die Antworten
Follow-up (allgemeiner) Frage:
Dieses zweite Beispiel ist ein allgemeiner Fall des ersten Beispiels.
class Fruit
class Apple extends Fruit
class Banana extends Fruit
class TrickyClass[T]{
def trickyMethod[S<:T](p1:S,p2:S)= println("I am tricky to solve!")
}
object TypeInferenceQuestion extends App{
val tricky=new TrickyClass[Fruit]()
tricky.trickyMethod(new Apple,new Apple) //this should be OK
tricky.trickyMethod(new Banana,new Banana) //this should be OK
tricky.trickyMethod(new Banana,new Apple) //this should NOT compile
}
Sicherlich wollen Sie die allgemeinen Parameter auf 'trickyMethod' gehen statt' TrickyClass'? Sie erlauben ausdrücklich, dass 'T' in der Definition von' tricky' 'Fruit' ist. – Lee
Ja, das ist meine Absicht. (Dies ist ein einfaches Beispiel, das das gleiche Problem aufweist, das bei einem komplizierteren Problem auftauchte.) – jhegedus