我知道我们可以使用“var”关键字在 Kotlin 中定义变量:
var foo = 3
最新的 java 更新(java 10)还引入了“var”类型:
var bar = new int[]{1, 2, 3}; // int[] bar = {1, 2, 3}
我的问题是,这些语言之间使用“var”有什么区别?
它们的含义是非常不同的,即使基本情况下的语法var x = ...
最终是相同的:
var
在 Kotlin 中的意思是“这是一个可变变量”,并且可以在推断类型和显式时使用var x: String = ...
:
var
在 Java 中表示“这是一个具有推断类型的变量”,可用于可变和final
变量。
var
在Java中只能用于局部变量;var
在 Kotlin 中也用于属性。
根据 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
在初始化时推断 的类型(在上述情况下,您将添加String
到new ArrayList<String>();
)。因此,Java 仍然保留其静态类型声明。
与 Kotlin 有什么区别?
用 定义的 Kotlin 中变量的类型var
也是推断出来的(但在 的情况下也可以是显式的var foo: Int
),并且 Kotlin 也是一种静态类型语言。
var
在 Java 10 中可以简化一些声明ArrayList<String>
和流的类型。
var
只能在 Java 10 的方法中使用。但你可以在 Kotlin 的任何地方编写它
Java 10中没有val
关键字,那么我们可以在 Java 10 中使用final var
as a val
。
(我想我们都知道默认可变和不可变,所以我不会描述它们。)
var
在 Intellij IDEA 2018.1+ 中被视为type
(JB Lexer) 和(JB Grammar Psi)。keyword
我为 Java 10 var type hints 开发了一个插件来显示它的类型(就像 Kotlin 一样)