2017-02-13 3 views
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?

+1

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. –

+0

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. –

+0

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

Antwort

0

Erstellt ein ticket, die als „out of scope“ Zitat von Adriaan Moors wurde geschlossen:

Typ-Inferenz nicht Grenzen unterstützen, die auf andere Art Parameter beziehen.