3

是以下方法声明,

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

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

相同?

4

2 回答 2

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>();

您将只能使用handleList1类型列表调用Bear。另一方面,您可以调用handleList2为:

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

因为它的通用参数是由方法提供的参数决定的。

于 2013-02-10T16:49:07.897 回答
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

在第二种情况下,两个参数都是与 extends相同类型的ArralLists 。Animal

于 2013-02-10T16:50:46.407 回答