在Java中,聲明變量a Set
與Set<Object>
之間有什麼區別?兩者不應該相等嗎?爲Set
指定Set<Object>
變量時爲什麼會出現編譯時錯誤?Java泛型:集與集<Object>
1
A
回答
1
編號:Set<>
是通用名稱,Set
不是。從邏輯上講,Set<Object>
可能相當於Set
(隱式,Set of Object
),但字節碼是完全不同的:)
建議:
運行在你的示例程序javap
命令並驗證自己這一點。
1
它是Java 1.4及以下和1.5以上的區別。
有很多關於爲什麼的信息。
http://download.oracle.com/javase/1,5.0/docs/guide/language/generics.html
3
這不是一個編譯時錯誤。這只是一個警告。即該編譯罰款:
Set s = new HashSet();
Set<Object> so = new HashSet<Object>();
s = so;
順便一提,所以不會
so = s;
而且他們基本上都是從使用的角度相同。
0
這兩者不等價。當您指定Set<Object>
時,您可以提高編譯器檢測集合的不安全操作的能力,否則這些操作在運行時會失敗。
這是覆蓋在喬希布洛赫的優秀Effective Java, Second Edition,從這個例子是無恥的啓發:
public static void main(String[] args) {
List<String> typesafeStrings = new ArrayList<String>();
unsafeAdd(typesafeStrings, new Integer(0)); // can add a Integer to a List<String>!
String s = typesafeStrings.get(0); // fails at runtime, not safe
typesafeStrings = new ArrayList<String>();
safeAdd(typesafeStrings, new Integer(0)); // compiler error, safe!
s = typesafeStrings.get(0);
}
static void unsafeAdd(List list, Object o) {
list.add(o);
}
static void safeAdd(List<Object> list, Object o) {
list.add(o);
}
2
這裏就是不等價...
Set<String> s_str = new HashSet<String>();
Set s_plain = s_str; // This is valid, although you will get a compiler warning
// This is invalid, the Set<String> cannot be implicitly cast to object even though
// it's *contents* are all objects.
Set<Object> s_obj = s_str;
現在讓我們假設你想必須將一個通用Set作爲參數傳遞給一個函數。您可以使用擴展
function void foo(Set<? extends Object> s) {}
在這種情況下,一個Set
,一個Set<Object>
和Set<String>
可以在所有的功能被傳遞,雖然他們都是不同的。
相關問題
- 1. Java泛型和集合集
- 2. 泛型與集合
- 3. Java 8泛型集合與可選項
- 4. Java泛型集合懷疑
- 5. 嵌套Java集合泛型
- 6. Java泛型和集合
- 7. Java的泛型集合
- 8. C#與泛型集合類
- 9. 泛型集合
- 10. Java - 泛型類型和集合
- 11. 泛型類型的GSON(Java集合)
- 12. Laravel泛型集合
- 13. 泛型集合MVC
- 14. 上泛型集合
- 15. Java:與泛型和收集類型檢測問題
- 16. 具有@NonNull與集合的返回類型的Java泛型
- 17. Typescript泛型回調類型提示與泛型集合
- 18. Java泛型集合和繼承
- 19. Java泛型和集合閱讀Refrences
- 20. Java泛型總是用於收集
- 21. GSON - 反序列化java泛型集合
- 22. 使用Java泛型解析XML(集合)
- 23. 關於Java集合和泛型:
- 24. 泛型集合和通配符的Java
- 25. Java泛型和收集分配
- 26. Java 8分組通過泛型集合
- 27. 在java中混合泛型和非泛型集合
- 28. 集合泛型類型
- 29. 有沒有包裝非泛型集合的泛型集合庫?
- 30. 從泛型集合到非泛型集合
你應該也許可以解決你的問題 – marc