以下是方法声明,
public void testMethod(ArrayList<T extends Animal> list)
和
public <T extends Animal> void testMethod(ArrayList<T> list)
还是一样?
它们在一个重要方面不同。对于第一种情况,泛型参数将绑定到类的作用域,并且不会在多次调用方法时发生更改。
在第二种情况下,泛型参数将取决于调用方法的参数,并且对于每个单独的调用可能不同。
所以,给定这个类:
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>();
您将只能使用类型为Bear
的列表调用handleList1
。另一方面,您可以将handleList2
称为:
test.handleList2(new ArrayList<Tiger>);
test.handleList2(new ArrayList<Lion>);
test.handleList2(new ArrayList<Puma>);
因为它的泛型参数是由方法提供的参数决定的。
区别在于前者不编译,而后者编译。这是你问的吗?
如果你的意思是区别:
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)
在第一种情况下,第一个自变量是扩展Animal
的某种类型的ArrayList
,第二个自变量是Arraylist
或扩展Animal
的某种(可能是其他)类型。
在第二种情况下,两个参数都是的ArralList
,与扩展Animal
的类型相同。