【发布时间】:2015-05-02 16:51:18
【问题描述】:
我使用的是 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> 这样的通用签名?
【问题讨论】:
标签: java generics type-erasure unchecked raw-types