差异

问题描述:

有以下几种方法声明,差异

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

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

一样吗?

+0

我这么认为,是的。当需要在多个参数上强制执行相同的泛型类型时,后者派上用场,或返回相同泛型类型的东西。 – 2013-02-10 16:45:49

+0

@MattiasBuelens:我认为这是一个答案。 – 2013-02-10 16:46:32

+0

我不明白。请你能更清楚吗?我对泛型很陌生。 – user1801716 2013-02-10 16:46:39

区别在于前者不编译,而后者编译。你在问什么?

如果指之间的差别:

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相同类型。

+0

哦,是的。我的意思是这个。但我无法理解答案 – user1801716 2013-02-10 16:52:50

+0

@ user1801716在第一个示例中,您没有绑定到列表类型参数的“类型变量”,因此您不能执行涉及该类型的任何操作。在第二个例子中你有:它是'T'。 – 2013-02-10 17:05:56

+0

“前者不编译”,如果它处于“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>(); 

你将只能拨打handleList1Bear类型的列表。因为它的泛型参数是由供应过多的方法的参数确定

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

:在另一方面,你可以调用handleList2作为。

+0

你能举个例子吗? – user1801716 2013-02-10 16:50:46

+0

当然 - 增加的例子,我会格式,当我不在电话上打字 – Perception 2013-02-10 17:07:01

+0

我帮你格式化;-) – Michael 2013-02-10 17:16:33