2011-02-15 51 views
3

这将使什么区别,如果Java集合接口有这样Java集合接口中的addAll()方法签名

<T extends E> boolean addAll(Collection<T> c); 

而不是 boolean addAll(Collection<? extends E> c);中的addAll方法签名?

感谢

-Abidi

+3

这里没有编译。但是,下列情况确实如此: boolean addAll(Collection c); – Puce 2011-02-15 17:23:38

+0

我的坏Puce,要编辑它。但我的问题仍然存在。谢谢 – Abidi 2011-02-15 17:35:19

回答

2

参与我们的测试接口:

public interface DumbTestInterface<E> { 

    <T extends E> boolean addAll1(Collection<T> c); 

    boolean addAll2(Collection<? extends E> c); 

} 

这里的字节码:

// Compiled from DumbTestInterface.java (version 1.6 : 50.0, no super bit) 
// Signature: <E:Ljava/lang/Object;>Ljava/lang/Object; 
public abstract interface rumba.dumba.DumbTestInterface { 

    // Method descriptor #6 (Ljava/util/Collection;)Z 
    // Signature: <T:TE;>(Ljava/util/Collection<TT;>;)Z 
    public abstract boolean addAll1(java.util.Collection arg0); 

    // Method descriptor #6 (Ljava/util/Collection;)Z 
    // Signature: (Ljava/util/Collection<+TE;>;)Z 
    public abstract boolean addAll2(java.util.Collection arg0); 
} 

正如你可以看到有在生成的字节码(除了生成的调试代码)没有区别。所以如果这两个版本是相同的,那么你可以坚持更容易理解的版本。

-2

我不认为这将汇编。一种方法不能同时有两种返回类型(<T>boolean)。

4

在这种情况下,具有<?><T>是等效的addAll用户。

我认为这是用于清晰度前的符号,因为使用<T>使得addAll更加复杂的签名。

2

的事情是,在<T extends E> boolean addAll(Collection<T> c)T是完全没有必要的,因为addAll不关心什么E亚型特异性它给集合包含。所有它关心的是它给出的集合包含的某些子类型E,这正是Collection<? extends E>的含义。

您不应该为方法引入不必要的泛型类型。

0

如果您使用了显式类T,那么您无法将通配集合传递给方法,这是您可能想要做的并应该能够做到的事情。

0

基本上,当类型变量T仅用于参数类型某处的某个位置时,可以安全地将其更改为?