考虑以下代码:
public class Main {
public static class NormalClass {
public Class<Integer> method() {
return Integer.class;
}
}
public static class GenericClass<T> {
public Class<Integer> method() {
return Integer.class;
}
}
public static void main(String... args) {
NormalClass safeInstance = new NormalClass();
Class<Integer> safeValue = safeInstance.method();
GenericClass unsafeInstance = new GenericClass();
Class<Integer> unsafeValue = unsafeInstance.method();
}
}
如果我用以下命令编译它:
$ javac -Xlint:unchecked Main.java
它返回:
Main.java:16: warning: [unchecked] unchecked conversion
Class<Integer> unsafeValue = unsafeInstance.method();
^
required: Class<Integer>
found: Class
1 warning
请注意,只有泛型方法被认为是不安全的,即使在返回类型上没有引用泛型类型。
这是一个javac
错误吗?或者我没有考虑到一个更深层次的原因?
发布于 2015-05-03 01:25:15
为了与Java1.4兼容,编译器假定如果您在实例类型声明中删除泛型参数,那么您将使用不存在泛型的特殊版本的类。如果您将Java1.4非泛型代码与Java 1.5+泛型代码混合在一起,它会发出警告。这比试图弄清楚你的方法的泛型返回类型实际上是否独立于参数要容易得多。如果你不喜欢,你可以随时使用@SuppressWarning
。
发布于 2015-05-03 03:38:27
这可能与GenericClass的实例化有关,它是一个参数化类型,因此其中需要类型参数。如果我们执行如下操作,则警告将消失
GenericClass<String> unsafeInstance = new GenericClass<String>();
OR
GenericClass<?> unsafeInstance = new GenericClass();
根据我的观点,引用"unsafeInstance
“是指与"safeInstance
”相反的泛型类。因此,编译器可能希望在代码中使用类型信息调用任何方法之前,将类型信息与引用相关联。
https://stackoverflow.com/questions/30005025
复制相似问题