簡體   English   中英

Java泛型錯誤?

[英]Java generics bug?

讓我們有以下類層次結構:

public class MyType {
}

public class MySuperclass<T extends MyType> {
    protected Map<String, String> myMap = new TreeMap<String, String>();
    protected String myMethod(String s) {
        return myMap.get(s);
    }
}

public class MySubclass extends MySuperclass {
    @Override
    protected String myMethod(String s) {
        return myMap.get(s); // <-- compilation error
    }
}

為什么MySubclass的overriden方法中存在編譯錯誤? 錯誤消息是“類型不匹配:無法從對象轉換為字符串”。

有趣的是,如果我在MySubclass定義中為MySuperclass定義泛型類類型,則編譯錯誤消失了:

public class MySubclass extends MySuperclass<MyType> {
    @Override
    protected String myMethod(String s) {
        return myMap.get(s);
    }
}

有人可以解釋這種行為嗎? 我認為這是一個Java編譯器錯誤。

我正在使用jdk1.6.0_24。

這不是一個bug。 通過擴展MySuperclass而不是MySuperclass<MyType> ,您將擴展原始類型 MySuperclass ,這意味着myMap也將是Map類型而不是Map<String, String>

這確實是不合理的。 這可以被認為是設計中的錯誤。 根本原因是決定保持通用集合API向后兼容,而不是保持原有集合API完整並引入新的通用API。 這個決定在技術上是無稽之談,他們的解釋是可笑的。 其背后的真正原因可能是Sun被迫推出Java5但沒有足夠的資源,所以他們采取了簡單的路線(擦除)。 所以我們完全搞砸了。 這種混蛋型系統本身不僅是一個問題,它也是引入任何新功能的一大障礙。

如果Foo是Bar的子類型(子類或子接口),並且G是一些泛型類型聲明,則不是G是G的子類型的情況。

您可以參考http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf (了解更多信息)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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