这将使什么区别,如果Java集合接口有这样Java集合接口中的addAll()方法签名
<T extends E> boolean addAll(Collection<T> c);
而不是 boolean addAll(Collection<? extends E> c);
中的addAll方法签名?
感谢
-Abidi
这将使什么区别,如果Java集合接口有这样Java集合接口中的addAll()方法签名
<T extends E> boolean addAll(Collection<T> c);
而不是 boolean addAll(Collection<? extends E> c);
中的addAll方法签名?
感谢
-Abidi
参与我们的测试接口:
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);
}
正如你可以看到有在生成的字节码(除了生成的调试代码)没有区别。所以如果这两个版本是相同的,那么你可以坚持更容易理解的版本。
我不认为这将汇编。一种方法不能同时有两种返回类型(<T>
和boolean
)。
在这种情况下,具有<?>
或<T>
是等效的addAll
用户。
我认为这是用于清晰度前的符号,因为使用<T>
使得addAll
更加复杂的签名。
的事情是,在<T extends E> boolean addAll(Collection<T> c)
的T
是完全没有必要的,因为addAll
不关心什么E
亚型特异性它给集合包含。所有它关心的是它给出的集合包含的某些子类型的E
,这正是Collection<? extends E>
的含义。
您不应该为方法引入不必要的泛型类型。
如果您使用了显式类T,那么您无法将通配集合传递给方法,这是您可能想要做的并应该能够做到的事情。
基本上,当类型变量T
仅用于参数类型某处的某个位置时,可以安全地将其更改为?
。
这里没有编译。但是,下列情况确实如此: boolean addAll(Collection c); –
Puce
2011-02-15 17:23:38
我的坏Puce,要编辑它。但我的问题仍然存在。谢谢 – Abidi 2011-02-15 17:35:19