使用Java10或+,我们可以使用var关键字进行声明。在初始化时,编译器将推断出一个类型。
当我实例化并赋值给用var声明的变量的类是接口的实现时,会发生什么?它将被推断为哪种类型,接口还是实现?
发布于 2021-01-04 15:28:35
我的2点意见来纠正问题和答案:
var is NOT a Java keyword。它是名为的保留类型。这看起来不是很大的区别,但实际上是:var var = 0;这里var也是一个变量名,所以var可以用作类型名,但没有像regular关键字那样的限制(即我们也可以有一个名为var的变量)。
Java
var i = true ? Integer.valueOf(1) : "ABC";Java编译器需要为变量i选择一个满足两个分支的类型。它可以是a) Object,b) Serializable,c) Comparable,或者组合,或者全部三个。我们不关心也不知道。
发布于 2020-07-24 20:50:49
到目前为止,其他答案没有强调一个重要的点,即编译时可推断类型和运行时实例类之间的区别。
假设我们有
var data = Collections.singleton("test");然后,编译器可以看到Collections.singleton("test")被声明为返回Set<String>。因此,data实际上被声明为Set<String> (而不是Collection<String>、Object或Collections.SingletonSet)。Set<String>是编译器能找到的最具体的信息。
运行时,data中引用的实例将是某个实现类(例如Collections.SingletonSet),由Collections.singleton()方法决定,这意味着data.getClass()不会返回Set类,而是实现Set接口的不同实现类,即Collections.SingletonSet。
因此,我们必须考虑三种类型:
Collections.SingletonSet)。当然,这将始终与(2)和(3)兼容,并且不能在赋值给变量的表达式的compile-time.Set<String>).var关键字时,编译器会将其视为使用from (2)中的类型(即Set<String>).)声明的
发布于 2020-07-24 20:12:50
“官方”局部变量类型推断风格指南(https://openjdk.java.net/projects/amber/LVTIstyle.html)提出了这一问题,但表示:
“这里必须重申,var只能用于局部变量。它不能用于推断字段类型、方法参数类型和方法返回类型。在这些上下文中,”编程到接口“的原则仍然很重要。”
和
“如果按照准则G2中的建议,局部变量的范围很小,则可以影响后续代码的具体实现的”泄漏“风险是有限的。”
https://stackoverflow.com/questions/63073153
复制相似问题