[英]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.