可以将具有推断类型的局部变量重新分配给不同的类型吗?
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
示例,它将无法编译。
我记得在某处读到过,具有推断类型的局部变量可以重新分配相同类型的值,这很有意义。
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
示例,它将无法编译。