我正在使用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