1
(Scala 2.11.8)Higher-kinder-Typen Inferenz
Betrachten Sie das folgende Snippet:
class Case2 {
trait Container[+A] {
def addAll[B >: A, T2 <: Container[B]](that: T2): Boolean
}
def t1: Container[String] = ???
def t2: Container[Int] = ???
// Works
t1.addAll[Any, Container[Any]](t2)
// Errors:
//* type mismatch; found : Case2.this.Container[Int] required: T2
//* inferred type arguments [String,Case2.this.Container[Int]] do not conform to method addAll's type parameter bounds [B >: String,T2 <: Case2.this.Container[B]]
t1.addAll(t2)
}
Warum nicht addAll
Anruf Inferenz die richtige kleinste gemeinsame geordneter Typ dauern kann?
Keine Antwort, aber brauchen Sie eigentlich das 'T2'? 'def addAll [B>: A] (das: Container [B]): Boolean sollte funktionieren und ist mehr wie das, was man normalerweise in einer solchen Situation sieht. –
Leider gibt es in realem Code Typabhängigkeiten, die von T2 abhängen, also glaube ich nicht, dass das möglich ist. Das obige Snippet ist eine Vereinfachung, die ich bei der Untersuchung eines Problems im ursprünglichen Code entwickelt habe. –
Es scheint, dass Sie in der Tat behaupten, dass Container [Int] <: Container [B] 'wo' B>: String' ist. Wenn Sie B explizit auf "Beliebig" setzen, funktioniert es (wie Sie gefunden haben), aber ich denke nicht, dass das Typ-Inferenzsystem Any als "Lösung" ersetzen kann. Ich bin mir aber nicht 100% sicher. – Phasmid