差异
有以下几种方法声明,差异
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