簡體   English   中英

Java generics:設置與設置<object><div id="text_translate"><p>在 Java 中,將變量聲明為Set與Set&lt;Object&gt;有什么區別? 兩者不應該是等價的嗎? 為什么將Set&lt;Object&gt;變量分配給Set時會出現編譯時錯誤?</p></div></object>

[英]Java generics: Set vs. Set<Object>

在 Java 中,將變量聲明為SetSet<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM