【发布时间】:2018-09-19 13:22:32
【问题描述】:
在查看var 功能后,如here 所示:
我在使用 JDK 10 设置我的 Eclipse/IntelliJ IDEA IDE 时遇到了困难,因此我向拥有 Java 10 工作环境的 StackOverflow 用户寻求帮助。
考虑以下几点:
public class A {
public void someMethod() { ... }
}
public class B extends A{
@Override
public void someMethod() { ... }
}
...
...
...
var myA = new A(); // Works as expected
myA = new B(); // Expected to fail in compilation due to var being
// syntactic sugar for declaring an A type
myA = (A) (new B()); // Should work
myA.someMethod(); // The question - which someMethod implementation is called?
当使用var 时,我希望JVM 能够识别变量所持有的派生类类型。并在执行 myA.someMethod() 时执行 B:someMethod() 而不是 A:someMethod()。
真的是这样吗?
【问题讨论】:
-
当
myA是A类型的变量并且B是A的子类型时,您为什么期望myA = new B()失败? -
@Holger 我的印象是 var 检查不允许派生类型成为声明的基类型的定义。作为一名 java 资深人士,我不希望出现这种预期的行为,我很高兴将派生类型的重新定义用作声明的 var 基类型的值。
-
使用
myA = new B()您不会重新定义变量。您只是在分配一个新值。变量的类型仍然是A,由变量声明时使用的初始化程序确定。 -
@Holger :我不知何故开始相信,在使用 var 时,重新分配值会触发重新定义 var 类型。显然不是这样。
-
它比你想象的要简单。当您说
var x = e时,无论e的类型是什么,编译器都会假装您将其声明为x的类型。此后,没有什么不同。相同的旧静态类型,只是编译器从上下文中为您选择一些类型。