为什么 java 允许“var”在不指定类型的情况下声明泛型变量,从而导致运行时问题?[关闭]

Why java allows "var" to declare generic variable without specifying type, leading to runtime issue? [closed]

提问人:Troskyvs 提问时间:8/5/2022 更新时间:8/5/2022 访问量:146

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

去年关闭。

嗨:这段代码被编译了:

    public static void main( String[] args ) {
        var list = new ArrayList<>();
        list.add("hello world");
        list.add(1);
        list.add(1.01);
        System.out.println(list);
        System.out.println( "Hello World!" );
    }

但是有运行时问题。局部变量属于但不属于任何泛型类型。为什么java会让这种代码通过编译?listArrayListArrayList<xxx>

如果我将第一行更改为:

ArrayList list = new ArrayList<>();

然后 javac 报告未检查/不安全操作的警告,建议使用并重新编译。为什么这里没有触发任何编译错误/警告?-Xlint:uncheckedvar

谢谢!

Java 泛型 类型 警告 var

评论

6赞 luk2302 8/5/2022
你在说什么运行时问题?问题是什么?第二个代码段使用原始类型。
6赞 Kayaman 8/5/2022
推断的类型为 。没有问题。ArrayList<Object>

答:

7赞 rgettman 8/5/2022 #1

在 Java 中,将 和 diamond 运算符一起使用是合法的。没有编译器规则规定必须有要显式推断的类型。var

这在没有编译器或运行时错误的情况下运行,您可以通过尝试自己运行它来看到。即使您将 a 添加到列表中,我们也可以推断 Java 推断出 .没有推断出公共类或公共接口,因为 Java 不会考虑后续语句。ThreadObjectArrayList

您也可以尝试将调用的返回值赋值给 ,以表示 ,但编译器会抱怨它无法转换为变量的类型,除非您将变量声明为 或 。getIntegerObjectvar

Integer one = list.get(1); // Error, can't convert Object to Integer
Object o1 = list.get(1);   // Compiles
var v1 = list.get(1);      // Compiles, inferred type: Object