1

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

假设我们有这样的:

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

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

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

(Ps 我知道它之间的区别,但在这种情况下,它看起来非常相似,因为我认为使用什么并不重要。)

4

2 回答 2

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)
于 2013-11-01T14:58:46.103 回答
1

List<? extends Number>表示在此处扩展 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 或任何其他类的东西。

于 2013-11-01T15:11:14.250 回答