我正在使用Android Studio 1.1.0。未檢查的分配警告
這將導致沒有任何警告:
public static class A {
public Map<Integer, String> getMap() {
return null;
}
}
public static class B {
public void processA(A a) {
Map<Integer, String> map = a.getMap();
}
}
但要A
通用:
public static class A<T> {
public Map<Integer, String> getMap() {
return null;
}
}
這行:
Map<Integer, String> map = a.getMap();
現在讓你一個警告:"Unchecked assignment: 'java.util.Map to java.util.Map<java.lang.Integer, java.lang.String>'
。
儘管getMap
的簽名完全獨立於T
,並且該代碼對於包含Map
的類型是明確的。
我知道我可以通過重新實現processA
如下襬脫了警告:
public <T> void processA(A<T> a) {
Map<Integer, String> map = a.getMap();
}
但我幹嘛要這麼做? T
這裏有什麼關係?
所以,問題是 - 爲什麼類型擦除得不僅影響T
(這是可以理解的 - 如果我傳遞的A
一個實例,T
是未知的),而且還「硬編碼」像<Integer, String>
一般簽名在這種情況下?
類型,但是嘿編譯器不知道這個事實 - 好吧,它可以很容易地知道它,只要看一下'processA'的實現,不難驗證'T'是不相關的; )按照你的建議,我會用'>'去,但是我對編譯器感到失望。 – 2015-03-02 12:10:36
@KonradMorawski在理想的世界裏,只有'A'應該是非法的,代碼不應該被編譯。但是出於向後兼容的原因,這是允許的。對於聲明爲「A」的類,其泛型類型對於執行與「A」相關的任何操作都非常重要。因此,不應該允許使用'A'(實際上在Scala中,僅僅使用'A'是非法的) –
Jatin
2015-03-02 12:17:21
是的,我想......我不使用Scala,但是我來自C#端的世界和Java的泛型感覺就像穿着太小的鞋子一樣。 – 2015-03-02 12:23:10