首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么javac认为在泛型类上调用具有泛型返回的方法是不安全的?

为什么javac认为在泛型类上调用具有泛型返回的方法是不安全的?
EN

Stack Overflow用户
提问于 2015-05-03 00:58:49
回答 2查看 824关注 0票数 16

考虑以下代码:

代码语言:javascript
复制
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();
    }
}

如果我用以下命令编译它:

代码语言:javascript
复制
$ javac -Xlint:unchecked Main.java 

它返回:

代码语言:javascript
复制
Main.java:16: warning: [unchecked] unchecked conversion
        Class<Integer> unsafeValue = unsafeInstance.method();
                                                          ^
  required: Class<Integer>
  found:    Class
1 warning

请注意,只有泛型方法被认为是不安全的,即使在返回类型上没有引用泛型类型。

这是一个javac错误吗?或者我没有考虑到一个更深层次的原因?

EN

回答 2

Stack Overflow用户

发布于 2015-05-03 01:25:15

为了与Java1.4兼容,编译器假定如果您在实例类型声明中删除泛型参数,那么您将使用不存在泛型的特殊版本的类。如果您将Java1.4非泛型代码与Java 1.5+泛型代码混合在一起,它会发出警告。这比试图弄清楚你的方法的泛型返回类型实际上是否独立于参数要容易得多。如果你不喜欢,你可以随时使用@SuppressWarning

票数 2
EN

Stack Overflow用户

发布于 2015-05-03 03:38:27

这可能与GenericClass的实例化有关,它是一个参数化类型,因此其中需要类型参数。如果我们执行如下操作,则警告将消失

代码语言:javascript
复制
GenericClass<String> unsafeInstance = new GenericClass<String>();
                          OR
GenericClass<?> unsafeInstance = new GenericClass();

根据我的观点,引用"unsafeInstance“是指与"safeInstance”相反的泛型类。因此,编译器可能希望在代码中使用类型信息调用任何方法之前,将类型信息与引用相关联。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30005025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档