【问题标题】:Can a local variable with an inferred type be reassigned to a different type?可以将具有推断类型的局部变量重新分配给不同的类型吗?
【发布时间】:2018-03-19 21:54:10
【问题描述】:

我记得在某处读到,具有推断类型的局部变量可以用相同类型的值重新分配,这是有道理的。

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

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

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

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

【问题讨论】:

  • 如果它们都是相同的类型,那么它应该可以工作,否则不行。从 C# 的经验来看,我相信在 java 中使用 var 的功能相同。
  • 类型推断不是动态类型。它只是编译器从其初始化程序的类型中找出变量的类型。一旦编译器在你的声明中为x 推断出int,你就声明了一个int 类型的变量。这就是整个故事;推理没有额外的作用。
  • 顺便说一句无法安装 JDK 10 的早期版本(出于什么原因?什么故障或错误)可能是一个更好的问题。 ;)
  • @nullpointer 完全无关 :P 这是一台学校发行的计算机,他们不希望我们安装东西,不幸的是!
  • :) 也许你是对的。但是从这个角度来看,您的问题可能听起来像 “我无法安装 Java,有人可以告诉我int x = 1; 在使用它时是否编译?” 不是吗?然后答案就像,我已经在某某机器上试过了。是的,它编译不,它没有。

标签: java object variables type-inference java-10


【解决方案1】:

不会编译,抛出 “不兼容的类型:扫描仪无法转换为 int”。局部变量类型推断不会改变 Java 的静态类型性质。换句话说:

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

只是语法糖:

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

【讨论】:

  • 我就是这么想的。只是好奇,但是编译器会抛出什么错误?
  • @JacobG。在 EA OpenJDK 上试过 --> “不兼容的类型:扫描仪无法转换为 int”
  • 有道理,所以它只是语法糖。谢谢!
  • @manouti 这里有一个follow sort of question stackoverflow.com/questions/49410939/…虽然这确实是语法糖,但 var 的 type 可以由编译器推断出来,并且有类型编译器可以推断出我们不能声明
  • @Eugene 有趣的帖子。在这种特殊情况下,您是对的,它是语法糖。对于不可表示的类型,它更像是一种我们以前无法表达的隐式类型。
【解决方案2】:

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

所以,例如这个:

var x = 5;
x = 1; 

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

另一方面,类似:

var x = 5;
x = "1"; 

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多