首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的Var关键字

Java中的Var关键字
EN

Stack Overflow用户
提问于 2020-07-24 20:02:05
回答 5查看 2.8K关注 0票数 4

使用Java10或+,我们可以使用var关键字进行声明。在初始化时,编译器将推断出一个类型。

当我实例化并赋值给用var声明的变量的类是接口的实现时,会发生什么?它将被推断为哪种类型,接口还是实现?

EN

回答 5

Stack Overflow用户

发布于 2021-01-04 15:28:35

我的2点意见来纠正问题和答案:

  1. var is NOT a Java keyword。它是名为的保留类型。这看起来不是很大的区别,但实际上是:

代码语言:javascript
复制
var var = 0;

这里var也是一个变量名,所以var可以用作类型名,但没有像regular关键字那样的限制(即我们也可以有一个名为var的变量)。

Java

  • 变量的实际类型是由编译器在编译时声明变量的行上决定的,但类型实际上并不是您在表达式右侧使用的确切实现。查看以下代码:

代码语言:javascript
复制
var i = true ? Integer.valueOf(1) : "ABC";

Java编译器需要为变量i选择一个满足两个分支的类型。它可以是a) Object,b) Serializable,c) Comparable,或者组合,或者全部三个。我们不关心也不知道。

票数 6
EN

Stack Overflow用户

发布于 2020-07-24 20:50:49

到目前为止,其他答案没有强调一个重要的点,即编译时可推断类型和运行时实例类之间的区别。

假设我们有

代码语言:javascript
复制
var data = Collections.singleton("test");

然后,编译器可以看到Collections.singleton("test")被声明为返回Set<String>。因此,data实际上被声明为Set<String> (而不是Collection<String>ObjectCollections.SingletonSet)。Set<String>是编译器能找到的最具体的信息。

运行时,data中引用的实例将是某个实现类(例如Collections.SingletonSet),由Collections.singleton()方法决定,这意味着data.getClass()不会返回Set类,而是实现Set接口的不同实现类,即Collections.SingletonSet

因此,我们必须考虑三种类型:

  1. 赋值给变量的实例的运行时类(例如Collections.SingletonSet)。当然,这将始终与(2)和(3)兼容,并且不能在赋值给变量的表达式的compile-time.
  2. The编译时类型(例如,变量的Set<String>).
  3. The声明类型)中知道。传统上,您会发现变量名的左边是显式的,当使用var关键字时,编译器会将其视为使用from (2)中的类型(即Set<String>).

)声明的

票数 2
EN

Stack Overflow用户

发布于 2020-07-24 20:12:50

“官方”局部变量类型推断风格指南(https://openjdk.java.net/projects/amber/LVTIstyle.html)提出了这一问题,但表示:

“这里必须重申,var只能用于局部变量。它不能用于推断字段类型、方法参数类型和方法返回类型。在这些上下文中,”编程到接口“的原则仍然很重要。”

“如果按照准则G2中的建议,局部变量的范围很小,则可以影响后续代码的具体实现的”泄漏“风险是有限的。”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63073153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档