2016-04-08 12 views
0

Ist es möglich, das Problem mit schwachen Inferenz zu lösen, ohne zusätzliche Variablen zu definieren oder Casts für Code unten eingeben?Typ Rückschluss Problem für generische Methode

public class GenericClass<T> { 
    public <R> R m(Class<R> cl) { 
     return null; 
    } 
} 

GenericClass<SomeClass> v2 = new GenericClass<SomeClass>() 
    .m(GenericClass.class) 
    .m(GenericClass.class); // <- Object cannot be converted to GenericClass<SomeClass> 

Antwort

3

Ja:

public class GenericClass<T> { 
    public <R> R m(Class<? super R> cl) { 
     return null; 
    } 
} 

GenericClass<SomeClass> v2 = new GenericClass<SomeClass>() 
    .<GenericClass<SomeClass>>m(GenericClass.class) 
    .m(GenericClass.class); 

Wir müssen die Tatsache beheben, dass cl könnte ein gelöschter Typ sein (dh ein Supertyp des generischen Typs, R), und dann müssen wir das sagen, Compiler was der echte Typ R ist, da das Argument Methode nur den Super-Typ angibt.

Der zweite Aufruf an m muss den generischen Typ nicht angegeben haben, da er aus der Zuweisung abgeleitet wird.

+0

Die generische Klasse ist eine Bibliotheksklasse eines Drittanbieters, die ich nicht ändern kann. Danke trotzdem. –

+0

Sie müssen dann casten. –

0

Um Sie Methode m in der Kette aufzurufen, muss es seine Klasse "this" zurückgeben. In Ihrem Fall ist GenericClass. Das sollte funktionieren.

für jeden Aufruf der "m" -Methode wird es seine eigene Klasse zurückgeben, dann können Sie es erneut aufrufen.

Ich hoffe, dass hilft.

Verwandte Themen