差異

2013-02-10 57 views
3

有以下幾種方法聲明,差異

public void testMethod(ArrayList<T extends Animal> list) 

public <T extends Animal> void testMethod(ArrayList<T> list) 

一樣嗎?

+0

我這麼認爲,是的。當需要在多個參數上強制執行相同的泛型類型時,後者派上用場,或返回相同泛型類型的東西。 – 2013-02-10 16:45:49

+0

@MattiasBuelens:我認爲這是一個答案。 – 2013-02-10 16:46:32

+0

我不明白。請你能更清楚嗎?我對泛型很陌生。 – user1801716 2013-02-10 16:46:39

回答

3

區別在於前者不編譯,而後者編譯。你在問什麼?

如果指之間的差別:

public void testMethod (ArrayList <? extends Animal> list) 

public <T extends Animal> void testMethod (ArrayList <T> list) 

則區別在於,在第一種情況下,你不能引用實際類型ArrayList元件,而在第二種情況下就可以。

可能,差別會更加明顯,如果我們將考慮以下兩種情況:

public void testMethod (
    ArrayList <? extends Animal> l1, 
    ArrayList <? extends Animal> l2) 

public <T extends Animal> void testMethod (
    ArrayList <T> l1, ArrayList <T> l2) 

在第一種情況下,第一個參數是某種類型的ArrayList那延伸Animal,第二個參數是Arraylist或延伸Animal的一些(可能是其他)類型。

在第二種情況下,兩個參數是ArralList S的延伸Animal相同類型。

+0

哦,是的。我的意思是這個。但我無法理解答案 – user1801716 2013-02-10 16:52:50

+0

@ user1801716在第一個示例中,您沒有綁定到列表類型參數的「類型變量」,因此您不能執行涉及該類型的任何操作。在第二個例子中你有:它是'T'。 – 2013-02-10 17:05:56

+0

「前者不編譯」,如果它處於「T」類型的範圍內(例如該類的類型參數) – newacct 2013-02-10 20:05:54

4

他們不是在一個重要的方式相同。對於第一種情況,泛型參數將被綁定到類的範圍,並且不會在該方法的多次調用中發生變化。

在第二種情況下,泛型參數將取決於調用該方法的參數,並且對於每個單獨的調用可能不同。

所以,對於這個類:

public class MyClass<T extends Animal> { 
    public void handleList1(List<T> list) { 
     // implementation 
    } 

    public <U extends Animal> void handleList2(List<U> list) { 
     // implementation 
    } 
} 

實例化它:

MyClass<Bear> test = new MyClass<Bear>(); 

你將只能撥打handleList1Bear類型的列表。因爲它的泛型參數是由供應過多的方法的參數確定

test.handleList2(new ArrayList<Tiger>); 
test.handleList2(new ArrayList<Lion>); 
test.handleList2(new ArrayList<Puma>); 

:在另一方面,你可以調用handleList2作爲。

+0

你能舉個例子嗎? – user1801716 2013-02-10 16:50:46

+0

當然 - 增加的例子,我會格式,當我不在電話上打字 – Perception 2013-02-10 17:07:01

+0

我幫你格式化;-) – Michael 2013-02-10 17:16:33