2013-08-29 14 views
5

Zastanawiam się, dlaczego nie można wywołać List<Number> nie z List<Integer> nawet Integer jest rozszerzoną klasą abstrakcyjnego numeru klasy? Wystąpił błąd logiczny, ponieważ mógłbym wywołać metodę z parametrem Number również z liczbą całkowitą.Dlaczego nie można wywołać listy <Number> nie z listą <Integer>, nawet jeśli liczba całkowita rozszerza numer?

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); 
} 
} 

go rozwiązać mogłem pracować z List<?> lub List<? extends Number> ... więc nie muszę rozwiązanie Chcę poznać dokładną przyczynę.

Jedynym rozwiązaniem, które mógłbym wymyślić List, jest powiązanie z Number jako nowy typ struktury danych.

+1

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

+3

Pomyślcie o tym: '' Lista można dodać 'Double'. 'List ' nie można dodać 'Double'. –

+5

Ponieważ generics nie są kowariantne jak tablice. Zobacz [** to pytanie **] (http://stackoverflow.com/q/17384083/1348195) na więcej szczegółów. –

Odpowiedz

11

Ponieważ można np. dodać instancję innego podklasy Number do List<Number> np obiektu typu Double, ale oczywiście nie należy dopuścić, aby dodać je do List<Integer>:

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

Jeśli pozwolono zadzwonić myMethod ze związkiem wystąpienie List<Integer> spowodowałoby zderzenie typu po wywołaniu add.

+0

, co jest dobrym wytłumaczeniem ... ma sens! – Fendrix

+1

przegłosuj, że jesteś szybszy i poprawny :) –

8

Generics nie są podobne jak tablice. Jest to niedozwolone z powodu usunięcia typu.

Rozważ klasy: Vehicle, Bike i Car.

Jeśli się

public void addVehicle(List<Vehicle> vehicles){ 
    vehicles.add(new Car()); 
} 
  • Jest to możliwe, ponieważ Car jest typu Vehicle można dodać Car do Vehicle ponieważ przechodzi IS-Test.
  • Ale co, jeśli pozwolono przejść List<Bike> do addVehicle(List<Vehicle> vehicles)?

Użytkownik dodałby Car do listy rowerów. co jest błędne. Tak więc generics nie pozwala na to.

Przeczytaj o Polymorphism with generics

Powiązane problemy