2012-03-30 6 views
15

Chcę odrzucić dwie listy: Pierwsza to lista liczb całkowitych. Deklaruję to jako:Dlaczego jest różnica w deklaracji ogólnych list?

List<Integer> ints= Arrays.asList(1,2,3); 

Działa dobrze.

Druga to lista obiektów. Deklaruję to jako:

List<Object> objs= Arrays.asList(1,2.13,"three"); 

Ale daje błąd w czasie zaćmienia, gdy tylko go napiszę. Błąd jest:

Multiple markers at this line 
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
List<Object> 
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for 
     a varargs parameter 

Zamiast jeśli piszę

List<Object> objs = Arrays.<Object>asList(1,2.13,"three"); 

To działa dobrze.

Nie jestem w stanie ustalić przyczyny.

Odpowiedz

14

Spójrz na this post on stackoverflow.

15.12.2.7 wywodząc Rodzaj Argumenty oparte na rzeczywistych Argumenty

supertypem ograniczenie T:> X zakłada, że ​​rozwiązanie jest jednym z supertypes X. Biorąc kilka takich ograniczeń na T, możemy przecinają się z zestawami supertekstów implikowanych przez każde z ograniczeń, ponieważ parametr typu musi być członkiem wszystkich z nich. Następnie możemy wybrać najbardziej konkretny typ który jest na skrzyżowaniu

najbardziej restrykcyjny typ przecięcia między String, Double i Integer jest zarówno interfejsy Comparable i Serializable. Więc kiedy piszesz

Arrays.asList(1,2.13,"three"); 

To wnioskuje T być implements Comparable<?>, Serializable .Następnie jest jakby robisz

List<Object> objs = new List<T extends Comparable<?>, Serializable> 

Oczywiście, nie jest to dozwolone.
Z drugiej strony, gdy podasz Object jawnie przy użyciu

Arrays.<Object>asList(1,2.13,"three"); 

nie wnioskowanie jest wykonany

+0

Mam to. Dzięki za wyjątkowo dobre wyjaśnienie. Będzie to złota zasada stosowana w przypadku takich pomyłek. –

2

Funkcja ta działa idealny

List<? extends Object> objs = Arrays.asList(10,20.32,"test"); 

System.out.println(objs); 

wyjściowa: [10, 20,32, test]

+3

To dobrze, ale zauważ, że jeśli chodzi o kompilator, 'List ' jest * nie * taki sam jak 'List ', a OP może potrzebować' List ' – Bohemian

+1

-1 Jak stwierdził OP,' Tablice. asList (1,2.13, "three") 'działa poprawnie.Pytanie brzmiało, dlaczego kompilator nie potrafi wywnioskować 'Object', a nie jak zhackować rozwiązanie. –