可以将具有推断类型的局部变量重新分配给不同的类型吗?

Can a local variable with an inferred type be reassigned to a different type?

我记得在某处读到过,具有推断类型的局部变量可以重新分配相同类型的值,这很有意义。

var x = 5;
x = 1; // Should compile, no?

不过,我很好奇如果您将 x 重新分配给不同类型的对象会发生什么。这样的东西还能编译吗?

var x = 5;
x = new Scanner(System.in); // What happens?

我目前无法安装 JDK 10 的早期版本,不想等到明天才知道。

无法编译,抛出 "incompatible types: Scanner cannot be converted to int"。局部变量类型推断不会改变 Java 的 static-typed 性质。换句话说:

var x = 5;
x = new Scanner(System.in);

只是语法糖:

int x = 5;
x = new Scanner(System.in);

一旦 var 变量被初始化,您就不能将它重新分配给不同的类型,因为类型已经被推断出来。

所以,例如这个:

var x = 5;
x = 1; 

会编译为 x 被推断为 int 并且将值 1 重新分配给它也很好,因为它们是相同的类型。

另一方面,类似于:

var x = 5;
x = "1"; 

不会编译,因为 x 被推断为 int 因此将 string 分配给 x 会导致编译错误。

这同样适用于您展示的 Scanner 示例,它将无法编译。