Java 10 和 kotlin 中的“var”

Posted

技术标签:

【中文标题】Java 10 和 kotlin 中的“var”【英文标题】:“var” in java 10 and kotlin 【发布时间】:2018-09-07 21:28:14 【问题描述】:

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

var foo = 3

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

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

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

【问题讨论】:

@ice1000 解决方案通常出现在文档中 【参考方案1】:

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

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

      var 在 Java 中的意思是“这是一个具有推断类型的变量”,既可用于可变变量,也可用于 final 变量。

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

【讨论】:

额外问题:Java 中的 var 与 c# 中的相同吗? This old post 表明 Java 中没有对应的,但现在答案可能已经过时了。 最佳答案已过时,但那里有几个相关答案。 顺便问一下,在这种情况下,有没有一种标准方法可以将答案标记为过时?你有代表在这里,我想你会知道的。或者,如果合适的话,你也可以这样做。 @user1306322 除了投反对票和/或发表评论,然后投赞成票或发布最新答案之外,没有其他办法。 var 在 Java 中的含义更接近于它在 C# 中的含义,而不是 Kotlin 或 Scala。【参考方案2】:

根据 Java 10 的release notes,它声明:

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

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

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

与 Kotlin 有什么区别?

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

【讨论】:

“应该没有。”假设由谁?意义完全不同。 "Kotlin 中用 var 定义的变量的类型也是推断出来的" 不,可以推断,也可以不推断。 在问题的上下文中,var foo = 3 是推断出来的。我没有说它不能明确。我已经删除了“据说”,我猜这个词的选择很糟糕。 +1 懒惰!一些程序员倾向于停止思考,而是到处使用新特性,相信它们一定会有所帮助。他们使用 var 而不是 int,相信他们更快... @Droidum 是的,但 Oracle 的 Java 语言架构师 Brian Goetz 似乎不同意,并认为根据他的喜好重新表述我的答案是合适的。 哇我觉得伪造别人帖子的内容是很不合适的!他是谁做的?真的,全世界都在抱怨在社交媒体上影响人们甚至选举——而这个论坛上的每个人都可以根据自己的需要随意修改其他人的意见?快点! (很抱歉进行了很多编辑,我仍然不熟悉在 cmets 中不按 enter)【参考方案3】:

Java 10 中的var 可以简化一些声明,例如ArrayList<String> 和流的类型。

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

Java 10 中没有 val 关键字,那么我们可以在 Java 10 中使用 final var 作为 val

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

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

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

【讨论】:

这不是我的问题的答案;您应该说明 Java 和 Kotlin 之间“var”的区别 是的,也许我没有说明差异......稍后我会改进这个答案。

以上是关于Java 10 和 kotlin 中的“var”的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin中变量不同于Java: var 对val(KAD 02)

Kotlin基础 数据类型:var和val

Kotlin基础 1.数据类型:var和val

Kotlin 什么是幕后字段?

Kotlin初学者变量-常量-数据类型

Kotlin Class基础