2013-04-28 203 views
3

問題1: 考慮:泛型與集合

List<Object> lo = new ArrayList<Object>(); 

,如果我理解正確的,在ArrayList<>()的參數必須是Object,所以我們需要寫呢?或者我們只是跳過這樣的:

List<Object> lo = new ArrayList<>(); 

問題2: 考慮:

List<? extends Animal> myArray = new ArrayList<Dog>(); 

據我瞭解,中=左側意味着myArrayList類型的引用,它可以是List<Cat>List<Dog>,.... =的右側怎麼樣,這是什麼意思?是否將參考myArray分配給List的實際對象,其中僅包含Dog?如果是的話,當=右邊的信息有用或必要時,我不會想到這種情況。你能給我一個例子嗎?

 ... = new ArrayList<Dog>(); 

是必不可少的或至少有用嗎?

+0

你是什麼意思 - 」*那麼=的右邊,它是什麼意思?這是否意味着引用myArray被分配給List僅包含Dog的真實對象?如果是,我不能不要考慮=右側的信息是有用還是必要的情況。*「? – Lion 2013-04-28 05:32:16

回答

2

第一個問題:Java 7 introduces the diamond operator,它充當句法糖在大多數情況下,寫出完整的泛型類型的。它可以省略,但它「仍然存在」。

第二個問題:

  • 左側是是upper-bounded generic wildcard列表。它包含包含任何擴展或實現名爲Animal的類的對象。除非將列表定義爲lower-bounded generic wildcard(使用super關鍵字),否則您將無法將任何值插入該列表。關於如何使用它們,何時使用它們以及如何將它們分類in this Java Trail還有一些。

  • 右側懸掛有點不同尋常,但可用於指定上限泛型列表,如果您首先填充您想要的列表

    List<? extends Animal> fooList = new ArrayList<>(); 
    List<Dog> barList = new ArrayList<>(); 
    barList.add(new Dog()); 
    barList.add(new Dog()); 
    barList.add(new Dog()); 
    barList.add(new Dog()); 
    
    fooList = barList; 
    

    你仍然有超過它迭代作爲上界泛型類型:

    for(Animal d : fooList) { 
        d.walk(); 
        d.talk(); 
    } 
    

從本質上講,你有辦法,現在是在誤導和沒有幫助的,因爲這新的ArrayList<Dog>是空的,無法添加到。 「

0

是否將引用myArray分配給僅包含Dog的List對象?

這意味着myArray被分配到一個包含Dog或任何類型的狗的列表,但是在使用myArray時,只保證包含在myArray中的對象是Animals。請注意,在java中,類型參數在編譯時被擦除。

1
  1. 只要您使用Java 7,只要引用類型不包含通配符(如List<? extends Number>),就可以這樣做。
  2. 當您使用通配符時,您只能執行類型安全操作。在這種情況下,你可以讀出列表。

例如:

List<? extends Number> list = ...; 
//more code 
Number n = list.get(0); 

但你不能放元素融入到列表:

List<? extends Number> list = ...; 
//more code 
list.add(new Double(1.5)); //compile-time error 

你不能,因爲你不知道實際類型的list 。如果該類型不是Double,而是Integer,該怎麼辦?

+0

鑽石符號似乎在通配符Java 7中正常工作... – Makoto 2013-04-28 05:44:00

2

Q1:你可以跳過它在Java 7中

Q2:該聲明並沒有太大的意義。 List<? extends SomeClass>作爲該方法的一個參數是有用的,以便開發人員能夠傳遞包含擴展SomeClass的所有類型的列表。但是,禁止添加任何進入該名單:

public void addAnimal(List<? extends Animal> animals) { 
     animals.add(new Dog()); // Compiler error 
} 

如果要做到這一點,你將不得不使用super關鍵字:List<? super SomeClass>

參見: