泛型有什么区别

时间:2013-11-01 14:57:09

标签: java

好的,我在这个网站上读到了这个问题,并没有回答我的主要观点。

假设我们喜欢这样:

public <T extends Number> void someMethod(List<T> list)

AND

public void someMethod(List<? extends Number> list)

考虑我不需要任何下限或上限列表。所以拒绝这些东西,在这种情况下有什么区别?因为?是未知列表,T是T列表,但从这一方面来看,它们是相似的(上述方法)。

(P.s。我知道它之间存在差异,但在这种情况下它看起来非常相似,因为我认为使用什么并不重要。)

2 个答案:

答案 0 :(得分:7)

这里:

public <T extends Number> void someMethod(List<T> list)

您可以在代码中使用未知类型T.例如:

T obj = list.get(0);
list.add(obj);

这里不可能:

public void someMethod(List<? extends Number> list)

答案 1 :(得分:1)

列表<? extends Number>表示在此处扩展数字的任何内容。 所以假设你有像

这样的课程
public class  Example<T extends Number> {

public <T extends Number> void someMethod(List<T> list) ...

public <T extends Number> void someOtherMethod(List<T> list) ...

}

public class SomeClass extends Number {
}

public class SomeClass2 extends Number {
}

你创建了一个像

这样的实例
Example<SomeClass> myExample =  new Example<SomeClass>();

所以当你想在这里使用你的方法时,输入参数必须完全与同一类SomeClass完全一致,我们不能在这里使用SomeClass2。例如,以下内容无效:

List<SomeClass2> someClass2 =  new ArrayList<SomeClass2>();
example.someMethod(someClass2);

但是如果你使用<? extends Number>作为someMethod的输入参数,那么它是可能的。您可以传递任何扩展Number,someClass2或3,4或任何其他类的内容。