這將使什麼區別,如果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