2013-07-26 34 views
-1

有人可以幫我找出如何應用類型擦除/泛型,使其工作。類型刪除在這裏工作?

Set<? extends Object> ss = new HashSet<Integer>(); 
Set<? extends Object> sa = new HashSet<Integer>(); 
ss.addAll(sa); 

現在它拋出編譯錯誤,因爲它會在編譯時檢查類型。

+0

你想完成什麼?只存儲整數或任何舊對象? –

+0

試圖將HashSet 添加到另一個HashSet中 user2526641

回答

1

先做你知道它爲什麼不起作用嗎?

它們是兩個獨立的通配符。儘管它們看起來一樣,但它們仍然是分開的。因此,第一個? extends Object(實際上你可以簡單地寫它?)與第二個不同。

而且,無論何時使用通配符,都不要期望引用該類型。但是,您在addAll()中這樣做需要進行類型檢查。

如果你有一個方法,這些邏輯,你可以給你的方法給予適當的類型參數:

public static <T> void addToFirst(Set<T> first, Set<T> second) { 
    first.addAll(second); 
} 

所以可以做這種類型的檢查,以確保第一和第二是同一類型的。

使用原始類型可能是另一種選擇。

問問自己是否真的需要在類型參數中使用通配符。只需使用Set<Integer>應該是最直接的。

+0

感謝您的信息 – user2526641

1

我相信你可以考慮你的類型擦除源將看起來像

Set ss = new HashSet(); 
set sa = new HashSet(); 
ss.addAll(sa); // compilation error 

如果它編譯

$ cat Erased.java 
import java.util.*; 

public class Erased { 

    public static void main(final String[] args) { 

     final Set<Integer> ss = new HashSet<Integer>(); 
     final Set<Integer> sa = new HashSet<Integer>(); 

     ss.addAll(sa); 
    } 
} 

$ javap -c Erased 
Compiled from "Erased.java" 
public class Erased { 
    public Erased(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: new   #2     // class java/util/HashSet 
     3: dup 
     4: invokespecial #3     // Method java/util/HashSet."<init>":()V 
     7: astore_1 
     8: new   #2     // class java/util/HashSet 
     11: dup 
     12: invokespecial #3     // Method java/util/HashSet."<init>":()V 
     15: astore_2 
     16: aload_1 
     17: aload_2 
     18: invokeinterface #4, 2   // InterfaceMethod java/util/Set.addAll:(Ljava/util/Collection;)Z 
     23: pop 
     24: return 
} 

這裏來反編譯源代碼

import java.util.HashSet; 
import java.util.Set; 

public class Erased 
{ 
    public static void main(String[] paramArrayOfString) 
    { 
    HashSet localHashSet1 = new HashSet(); 
    HashSet localHashSet2 = new HashSet(); 

    localHashSet1.addAll(localHashSet2); 
    } 
} 
+0

對不起如果我的問題不清楚。我的問題是如何應用Type擦除,以便addAll方法接受localHashSet2。 – user2526641

+0

類型擦除是由編譯器應用的東西,而不是你。 –