2013-11-01 166 views
1

好吧,我在这个网站上看到这个问题,它没有回答我的主要观点。泛型有什么区别

假设我们有这样的:

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

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

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

(诗我知道这之间的差异,但在这种情况下,它看起来对我来说非常相似,因为我认为这不要紧,用什么。)

+0

你不能添加元素到'List <?扩展Number>'。 –

+0

是的,这是真的,现在我明白了。谢谢 – Ernusc

回答

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) 
+0

在通配符中我可以使用数字的子类型,在我的泛型类型中是否相同? – Ernusc

+0

对不起,我不明白你的问题。 –

+0

@Ernusc首先声明您可以在方法签名中使用'T'作为类型,而不必使用'Number'(并且如果需要,您可以在将来更容易地更改它) –

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

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

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

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

+0

谢谢,这个例子使一切更清晰。 :) +1 – Ernusc