是以下方法声明,
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>();
您将只能使用handleList1
类型列表调用Bear
。另一方面,您可以调用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)
在第一种情况下,第一个参数是ArrayList
扩展的某种类型,Animal
第二个参数是扩展的一个Arraylist
或某些(可能是其他)类型Animal
。
在第二种情况下,两个参数都是与 extends相同类型的ArralList
s 。Animal