2 Stimmen

Java Generische Methode Frage

Überlegen Sie sich diesen Code:

public  List meth(List type)
{
   System.out.println(type); // 1
   return new ArrayList(); // 2
}

Es kompiliert nicht in Zeile 2 und sagt, dass eine List benötigt wird.

Jetzt, wenn es geändert wird zu:

public  List meth(List type)
{
   System.out.println(type); // 1
   return new ArrayList(); // 2
}

Es kompiliert. Warum? Ich dachte, der Unterschied zwischen der Deklaration eines generischen Typs mit T und der Verwendung des Wildcards sei, dass man bei Verwendung des Wildcards keine neuen Elemente zu einer Sammlung hinzufügen kann. Warum würde die Rückgabe eines Subtyps von List erlauben? Ich vermisse hier etwas, was ist die explizite Regel und wie wird sie angewendet?

4voto

notnoop Punkte 57727

Der Unterschied liegt in der Rückgabetyp-Deklaration. List ist kein Subtyp von List, aber ein Subtyp von List.

List macht keine Annahmen über seine Typvariable, daher sind die folgenden Aussagen gültig:

List l0 = new ArrayList();
List l1 = new ArrayList();
List ltemp = null;
List l2 = ltemp;

List nimmt an, dass das Typargument im Kontext des Clients aufgelöst wird (z.B. Typverwendung), wenn Sie es als List oder List deklariert haben. Im Methodenrumpf können Sie auch keine Annahmen darüber treffen.

1voto

mmx Punkte 400975

In diesem Fall ist T nicht unbedingt eine Superklasse von String. Wenn Sie ein T wie Integer wählen und die Methode aufrufen, schlägt sie fehl; daher wird sie nicht kompilieren. Allerdings wird das zweite sicher kompilieren, da jede ArrayList eine gültige List von etwas ist.

1voto

Valentin Rocher Punkte 11493

Wie bereits erwähnt, ist String kein Untertyp von T, deshalb funktioniert es nicht. Allerdings funktioniert dieser Code:

public  List meth(List type)
{
   System.out.println(type); // 1
   return new ArrayList(); // 2
}

und entspricht eher dem, was du willst, denke ich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X