2011-02-15 46 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僅用於參數類型某處的某個位置時,可以安全地將其更改爲?