Java:
public class Inferenz {
class A{}
class B{} extends
class C extends B{}
class D extends B{}
class E extends C{}
interface Feld<T>{};
class FeldFix<T> implements Feld<T>{ FeldFix ( int i ) { } ; }
<T> T erste ( Feld <? super T> f1 , Feld <? extends T> f 2 ) {T r=null ; return r ; }
<S , T> S [ ] zweite (T [ ] a , Feld <? extends S> b ) {S [ ] s f = null ; return s f ; }
void doit ( ) {
B b = erste ( new FeldFix<B>(3) , new FeldFix<D> ( 3 ) ); //1
Object o = erste ( new FeldFix<C>(3) , new FeldFix<B> ( 3 ) ); //2
B d = erste ( new FeldFix<C>(3) , new FeldFix<C> ( 3 ) ); //3
E e = erste ( new FeldFix<C>(3) , new FeldFix<C> ( 3 ) ); //4
C [ ] [ ] ca = zweite ( new D[ 3 ] , new FeldFix<E[ ] > ( 3 ) ) ; //5
}
}
Ich habe eine Frage zu diesem Code:
Kann mir jemand erklären, wie die Rückgabetypen in der Methode doit() zustande kommen ?
Normalerweise kannte ich es so, dass bei <? super T> die Obertypen von T oder T selber in Fragen kommt und bei <? extends T> der Untertyp von T oder T selber in Frage kommt. Hier hat es jedoch mit dieser Herangehensweise nicht geklappt, sodass ich die Rückgabetypen auf Papier ohne IDE leider nicht richtig erkannt habe.
Erst als ich auf eclipse den Code reinkopiert habe, merkte ich, an welchen Stellen die Zuweisung funktioniert und wo nicht. Beispielsweise die Zuweisung //1 habe ich leider falsch gehabt.
Würde mich sehr freuen, wenn wir jemand dies erklären könnte. Vielen Dank im Voraus.
Zuletzt bearbeitet: