有人可以幫我找出如何應用類型擦除/泛型,使其工作。類型刪除在這裏工作?
Set<? extends Object> ss = new HashSet<Integer>();
Set<? extends Object> sa = new HashSet<Integer>();
ss.addAll(sa);
現在它拋出編譯錯誤,因爲它會在編譯時檢查類型。
有人可以幫我找出如何應用類型擦除/泛型,使其工作。類型刪除在這裏工作?
Set<? extends Object> ss = new HashSet<Integer>();
Set<? extends Object> sa = new HashSet<Integer>();
ss.addAll(sa);
現在它拋出編譯錯誤,因爲它會在編譯時檢查類型。
先做你知道它爲什麼不起作用嗎?
它們是兩個獨立的通配符。儘管它們看起來一樣,但它們仍然是分開的。因此,第一個? extends Object
(實際上你可以簡單地寫它?
)與第二個不同。
而且,無論何時使用通配符,都不要期望引用該類型。但是,您在addAll()
中這樣做需要進行類型檢查。
如果你有一個方法,這些邏輯,你可以給你的方法給予適當的類型參數:
public static <T> void addToFirst(Set<T> first, Set<T> second) {
first.addAll(second);
}
所以可以做這種類型的檢查,以確保第一和第二是同一類型的。
使用原始類型可能是另一種選擇。
問問自己是否真的需要在類型參數中使用通配符。只需使用Set<Integer>
應該是最直接的。
感謝您的信息 – user2526641
我相信你可以考慮你的類型擦除源將看起來像
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);
}
}
對不起如果我的問題不清楚。我的問題是如何應用Type擦除,以便addAll方法接受localHashSet2。 – user2526641
類型擦除是由編譯器應用的東西,而不是你。 –
你想完成什麼?只存儲整數或任何舊對象? –
試圖將HashSet添加到另一個HashSet中 –
user2526641