[英]Java generics: Set vs. Set<Object>
在 Java 中,將變量聲明為Set
與Set<Object>
有什么區別? 兩者不應該是等價的嗎? 為什么將Set<Object>
變量分配給Set
時會出現編譯時錯誤?
這不是編譯時錯誤。 這只是一個警告。 即這編譯得很好:
Set s = new HashSet();
Set<Object> so = new HashSet<Object>();
s = so;
順便說一句,也是如此
so = s;
從使用角度來看,它們基本相同。
這是不等價的地方......
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 的參數。 您可以使用擴展
function void foo(Set<? extends Object> s) {}
在這種情況下,一個Set
、一個Set<Object>
和一個Set<String>
都可以傳遞給 function,盡管它們都是不同的。
否: Set<>
是通用的,而Set
不是。 從邏輯上講, Set<Object>
可能等同於Set
(隱式地, Set of Object
),但字節碼完全不同:)
建議:
在您的示例程序上運行javap
命令並自己驗證這一點。
Java 1.4 及以下和 1.5 及以上之間的區別。
有很多關於原因的信息。
http://download.oracle.com/javase/1,5.0/docs/guide/language/generics.html
兩者不等價。 當您分配Set<Object>
時,您增加了編譯器檢測集合的不安全操作的能力,否則這些操作將在運行時失敗。
這在 Josh Bloch 出色的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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.