23

我知道我们可以使用“var”关键字在 Kotlin 中定义变量:

var foo = 3

最新的 java 更新(java 10)还引入了“var”类型:

var bar = new int[]{1, 2, 3}; // int[] bar = {1, 2, 3}

我的问题是,这些语言之间使用“var”有什么区别?

4

3 回答 3

28
  1. 它们的含义是非常不同的,即使基本情况下的语法var x = ...最终是相同的:

    1. var在 Kotlin 中的意思是“这是一个可变变量”,并且可以在推断类型和显式时使用var x: String = ...

    2. var在 Java 中表示“这是一个具有推断类型的变量”,可用于可变和final变量。

  2. var在Java中只能用于局部变量;var在 Kotlin 中也用于属性。

于 2018-03-29T06:56:07.863 回答
13

根据 Java 10 的发行说明,它指出:

我们试图通过减少与编写 Java 代码相关的仪式来改善开发人员体验,同时保持 Java 对静态类型安全的承诺,允许开发人员省略通常不必要的局部变量类型的清单声明。例如,此功能将允许以下声明:

var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>

所以基本上,这是为了适应程序员的懒惰;List<String> list = new ArrayList<>();您现在可以省略List<String>, 并将其替换为 ,而不是编写,var从而允许 Java推断是哪种类型list- 它能够做到这一点,因为变量在定义时被初始化。请注意,您必须list在初始化时推断 的类型(在上述情况下,您将添加Stringnew ArrayList<String>();)。因此,Java 仍然保留其静态类型声明。

与 Kotlin 有什么区别?

用 定义的 Kotlin 中变量的类型var也是推断出来的(但在 的情况下也可以是显式的var foo: Int),并且 Kotlin 也是一种静态类型语言。

于 2018-03-29T03:20:25.177 回答
5
  • var在 Java 10 中可以简化一些声明ArrayList<String>和流的类型。

  • var只能在 Java 10 的方法中使用。但你可以在 Kotlin 的任何地方编写它

  • Java 10中没有val关键字,那么我们可以在 Java 10 中使用final varas a val

(我想我们都知道默认可变和不可变,所以我不会描述它们。)

var在 Intellij IDEA 2018.1+ 中被视为type(JB Lexer) 和(JB Grammar Psi)。keyword

我为 Java 10 var type hints 开发了一个插件来显示它的类型(就像 Kotlin 一样)

于 2018-03-29T10:15:09.323 回答