我知道我们可以使用“var”关键字在Kotlin中定义变量:
var foo = 3
最新的java更新(java 10)也引入了“var”类型:
var bar = new int[]{1, 2, 3}; // int[] bar = {1, 2, 3}
我的问题是,这些语言之间使用“var”的区别是什么?
答案 0 :(得分:28)
即使基本情况var
中的语法最终相同,它们的含义也大不相同:
var x: String = ...
表示“这是一个可变变量”,并且可以在推断类型和显式时使用var
;
final
表示“这是一个带推断类型的变量”,可用于变量和var
变量。
var
只能用于局部变量; Kotlin中的public static String getServerNameAndContextPath(HttpServletRequest req) {
return "https://" + req.getServerName() + req.getContextPath();
}
也用于属性。
答案 1 :(得分:13)
根据Java 10的release notes,它声明:
我们通过减少仪式来寻求改善开发者体验 与编写Java代码相关联,同时保持Java的承诺 通过允许开发人员来避免静态类型安全 经常不必要的局部变量类型的清单声明。这个 例如,feature允许声明如下:
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有什么区别?
还推断了使用var
定义的Kotlin中的变量类型(但在var foo: Int
的情况下也可以是显式的),而Kotlin也是静态类型语言。
答案 2 :(得分:5)
var
可以简化某些声明,例如ArrayList<String>
和流的类型。
var
只能用于Java 10的方法。但是你可以在Kotlin的任何地方写它
Java 10中没有val
关键字,因此我们可以在Java 10中将final var
用作val
。
(我认为默认情况下我们都知道可变和不可变因此我不会描述它们。)
在Intellij IDEA 2018.1 +中, var
被视为type
(JB Lexer)和keyword
(JB Grammar Psi)。
我已经开发了一个Java 10 var类型提示插件来显示它的类型(看起来像Kotlin)