java 10和kotlin中的“var”

“var” in java 10 and kotlin

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

1
var foo = 3

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

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

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


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

  • Kotlin中的var表示"这是一个可变变量",并且可以在推断类型和显式时使用:var x: String = ...;

  • Java中的var表示"这是一个带有推断类型的变量",可以用于mutable和final变量。

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


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

    We seek to improve the developer experience by reducing the ceremony
    associated with writing Java code, while maintaining Java's commitment
    to static type safety, by allowing developers to elide the
    often-unnecessary manifest declaration of local variable types. This
    feature would allow, for example, declarations such as:

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

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

    与Kotlin有什么区别?

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


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

    • 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类型提示开发了一个插件来显示它的类型(看起来像Kotlin)

    >
</p>
<div class=