2013-08-29 5 views
5

Ich frage mich, warum ist es nicht möglich, List<Number> nicht mit List<Integer> gerade Integer ist eine erweiterte Klasse der abstrakten Klasse Nummer? Es gibt einen logischen Fehler, da ich eine Methode mit dem Parameter Number auch mit Integer aufrufen könnte.Warum ist es nicht möglich, die Liste <Number> nicht mit der Liste <Integer> aufzurufen, auch wenn Integer die Nummer erweitert?

public class Que 
{ 

public void enterNumbers(List<Number> nummern) 
{ 
    for (Number number : nummern) 
    { 
     System.out.println(number + "\n"); 
    } 
} 

public void enterNum(Number num) 
{ 
    System.out.println("This is a number " + num); 
} 

public static void main(String[] args) 
{ 
    Que que = new Que(); 

    Integer myInteger = new Integer(7); 
    // possible (of course!) 
    que.enterNum(myInteger); 

    List<Integer> num = new ArrayList<Integer>(); 
    num.add(4); 
    num.add(45); 
    Integer inte = new Integer(333); 

    num.add(inte); 
    // not possible ! 
    que.enterNumbers(num); 
} 
} 

es zu lösen ich mit List<?> oder List<? extends Number> ... arbeiten konnte so brauche ich nicht die Lösung, die ich den genauen Grund wissen will.

Die einzige Lösung, die ich an List denken könnte, ist die Bindung mit Number als neue Art von Datenstruktur.

+1

http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html Lesen – kosa

+3

Denken Sie daran: 'Liste ' Sie eine 'Double' hinzufügen können. 'List ' Sie können kein 'Double' hinzufügen. –

+5

Da Generika nicht kovariant wie Arrays sind. Weitere Details finden Sie unter [** diese Frage **] (http://stackoverflow.com/q/17384083/1348195). –

Antwort

11

Da könnten Sie z.B. fügen Sie eine Instanz einer anderen Unterklasse von Number-List<Number>, zB ein Objekt vom Typ Double, aber natürlich sollten Sie nicht erlaubt werden, um sie zu List<Integer> hinzuzufügen:

public void myMethod(List<Number> list) { 
    list.add(new Double(5.5)); 
} 

Wenn Sie durften myMethod mit einem anrufen Instanz von List<Integer> Dies würde zu einem Typüberschneidungen führen, wenn add aufgerufen wird.

+0

das ist eine gute Erklärung ... macht Sinn! – Fendrix

+1

upvote für schneller und richtig :) –

8

Generika sind nicht ähnlich wie Arrays. Dies ist wegen des Löschens von Typen nicht erlaubt.

Betrachten Sie die Klassen Vehicle, Bike und Car.

Wenn Sie

public void addVehicle(List<Vehicle> vehicles){ 
    vehicles.add(new Car()); 
} 
  • Dies ist möglich, weil ein Car vom Typ Vehicle, können Sie eine Car in Vehicle hinzufügen, da es passiert IS-A-Test.
  • Aber was, wenn es erlaubt wurde, eine List<Bike> zu addVehicle(List<Vehicle> vehicles) zu übergeben?

Sie hätten eine Car Fahrrad-Liste hinzugefügt. Das ist einfach falsch. Generika erlauben das nicht.

über Polymorphism with generics

Verwandte Themen