提问人:Troskyvs 提问时间:8/5/2022 更新时间:8/5/2022 访问量:146
为什么 java 允许“var”在不指定类型的情况下声明泛型变量,从而导致运行时问题?[关闭]
Why java allows "var" to declare generic variable without specifying type, leading to runtime issue? [closed]
问:
嗨:这段代码被编译了:
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会让这种代码通过编译?list
ArrayList
ArrayList<xxx>
如果我将第一行更改为:
ArrayList list = new ArrayList<>();
然后 javac 报告未检查/不安全操作的警告,建议使用并重新编译。为什么这里没有触发任何编译错误/警告?-Xlint:unchecked
var
谢谢!
答:
7赞
rgettman
8/5/2022
#1
在 Java 中,将 和 diamond 运算符一起使用是合法的。没有编译器规则规定必须有要显式推断的类型。var
这在没有编译器或运行时错误的情况下运行,您可以通过尝试自己运行它来看到。即使您将 a 添加到列表中,我们也可以推断 Java 推断出 .没有推断出公共类或公共接口,因为 Java 不会考虑后续语句。Thread
Object
ArrayList
您也可以尝试将调用的返回值赋值给 ,以表示 ,但编译器会抱怨它无法转换为变量的类型,除非您将变量声明为 或 。get
Integer
Object
var
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
评论
ArrayList<Object>