有以下幾種方法聲明,差異
public void testMethod(ArrayList<T extends Animal> list)
和
public <T extends Animal> void testMethod(ArrayList<T> list)
一樣嗎?
有以下幾種方法聲明,差異
public void testMethod(ArrayList<T extends Animal> list)
和
public <T extends Animal> void testMethod(ArrayList<T> list)
一樣嗎?
區別在於前者不編譯,而後者編譯。你在問什麼?
如果指之間的差別:
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
相同類型。
哦,是的。我的意思是這個。但我無法理解答案 – user1801716 2013-02-10 16:52:50
@ user1801716在第一個示例中,您沒有綁定到列表類型參數的「類型變量」,因此您不能執行涉及該類型的任何操作。在第二個例子中你有:它是'T'。 – 2013-02-10 17:05:56
「前者不編譯」,如果它處於「T」類型的範圍內(例如該類的類型參數) – newacct 2013-02-10 20:05:54
他們不是在一個重要的方式相同。對於第一種情況,泛型參數將被綁定到類的範圍,並且不會在該方法的多次調用中發生變化。
在第二種情況下,泛型參數將取決於調用該方法的參數,並且對於每個單獨的調用可能不同。
所以,對於這個類:
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>();
你將只能撥打handleList1
與Bear
類型的列表。因爲它的泛型參數是由供應過多的方法的參數確定
test.handleList2(new ArrayList<Tiger>);
test.handleList2(new ArrayList<Lion>);
test.handleList2(new ArrayList<Puma>);
:在另一方面,你可以調用handleList2
作爲。
你能舉個例子嗎? – user1801716 2013-02-10 16:50:46
當然 - 增加的例子,我會格式,當我不在電話上打字 – Perception 2013-02-10 17:07:01
我幫你格式化;-) – Michael 2013-02-10 17:16:33
我這麼認爲,是的。當需要在多個參數上強制執行相同的泛型類型時,後者派上用場,或返回相同泛型類型的東西。 – 2013-02-10 16:45:49
@MattiasBuelens:我認爲這是一個答案。 – 2013-02-10 16:46:32
我不明白。請你能更清楚嗎?我對泛型很陌生。 – user1801716 2013-02-10 16:46:39