如果调用的方法中不存在类的泛型类型,为什么会出现“不兼容类型”编译错误?

gpnt7bae  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(393)

这个问题在这里已经有答案了

什么是原始类型?为什么不使用它(15个答案)
两年前关门了。
请注意下面的代码没有编译,方法结果赋值失败: String s = a.method(""); .
编译错误: incompatible types: java.lang.Object cannot be converted to java.lang.String 但是,改变的时候 A aA<?> a 或者 A<Object> a ,编译通过。

  • 请注意类型 <T> 在方法上不同于类型 <O> 在课堂上。

知道编译错误是什么吗?还有,为什么在变量中使用泛型定义 a 解决编译问题?

class A<O>
{
    O something;

    <T> T method(T t)
    {
        return t;
    }

    static void testJavaStrangeGenericDefinitionBehavior()
    {
        A a = null;

        String s = a.method("abc");
    }
}
cyvaqqii

cyvaqqii1#

A a = null;

应该是:

A<String> a = null; // or better yet, new A<String>();

不过,你可以用任何一门课来代替 String 因为,正如你所说 T 以及 O 泛型是不同的类型。
删除泛型参数后,方法调用中的所有泛型都将丢失,这实际上相当于调用:

Object method(Object t);
vql8enpb

vql8enpb2#

这是因为java type erasure 向后兼容性的含义所有泛型类型声明只存在于源代码中,编译后将转换为 Object 参考资料和适当的幕后演员 JVM 在这种情况下,我不明白你的意思 O 或者 T .

相关问题