2016-07-19 7 views
-1

Ich habe eine Schnittstelle Int1. Ich habe eine Klasse Cls1 Implementierung Int1. Und eine generische Klasse Cls2<Cls1>.Umwandlung eines Untertyps in einen als generischen Typ definierten Typ

Jetzt schreibe ich eine Methode:

private void <T extends Int1> test(Cls2<Cls1> arg1) { 
    ... 
    //I try to cast a Cls2<Cls1> into a Cls2<Int1>: it works 
    Cls2<Int1> test1 = (Cls2<Int1>) arg1; 
    //I try to cast a Cls2<Cls1> into a Cls2<T>: doesn't work 
    Cls2<T> test2 = (Cls2<T>) arg1; //compilation error 
} 

Bedenkt man, dass T erstreckt Int1, was mit diesem Code falsch?

+0

"Es funktioniert", weil es redundant ist: Sie müssen keinen Typ für sich selbst darstellen. –

+0

"Kompilierungsfehler", weil 'T' nicht immer' Cls1' ist; Es könnte * Cls1 sein, aber es könnte auch eine Unterklasse davon sein. –

+1

Worauf kommt es an, die Methode generisch zu machen ( '), wenn" T "nicht in der Methodensignatur verwendet wird. – Andreas

Antwort

0

Der folgende Code kompiliert w/o Fehler in intellij.

interface Int1{} 
class Cls2<T>{} 
class Cls1 implements Int1 {} 


private <T extends Int1> void test(Cls2<Cls1> arg1) { 
    Cls2<Int1> test1 = (Cls2<Int1>)(Cls2<?>)arg1; 
    Cls2<T> test2 = (Cls2<T>) arg1; 
} 

In Java ist die durch Unterklasse und Superklasse parametrisierte Klasse nicht verwandt. Sie müssen zuerst eine <?> abgeben.

Insgesamt, wenn was ich oben Ihren Code richtig widerspiegelt, ist es eine sehr seltsame Verwendung von Generika. Bitte stellen Sie sicher, dass Ihr Design korrekt ist.

+0

Ich habe meinen vollständigen Anwendungsfall nicht angezeigt, aber das liegt daran, dass der zurückgegebene Wert der Methode sowohl durch "T" als auch durch eines der Argumente eingegeben wird. Und irgendwo in dieser Methode erhalte ich ein Objekt mit einem Untertyp von "T". Ich konnte nicht verstehen, warum es ungültig war, es zurückzugeben ... Gibt es irgendeinen Weg, dies ohne Warnungen zu tun und ohne die Warnung zu unterdrücken? – FBB