好的,我在这个网站上读到了这个问题,并没有回答我的主要观点。
假设我们喜欢这样:
public <T extends Number> void someMethod(List<T> list)
AND
public void someMethod(List<? extends Number> list)
考虑我不需要任何下限或上限列表。所以拒绝这些东西,在这种情况下有什么区别?因为?是未知列表,T是T列表,但从这一方面来看,它们是相似的(上述方法)。
(P.s。我知道它之间存在差异,但在这种情况下它看起来非常相似,因为我认为使用什么并不重要。)
答案 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或任何其他类的内容。