Java 10’var’和inheritance

在查看varfunction之后,如下所示:

我在使用JDK 10设置Eclipse / IntelliJ IDEA IDE时遇到了困难,因此向具有可用Java 10环境的Stack Overflow用户寻求帮助。

考虑以下:

 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()。

确实如此吗?

感谢nullpointer提供了一个在线Java 10编译器的链接 ,我得到了以下有趣的结果:

 public class Main { static class A { public void someMethod() { System.out.println(this.getClass().getName()); } } static class B extends A{ @Override public void someMethod() { System.out.println("Derived: " + this.getClass().getName()); } } public static void main(String[] args) { var myA = new A(); myA.someMethod(); myA = new B(); // does not fail to compile! myA.someMethod(); } } 

产出:

 Main$A // As expected Derived: Main$B // As expected in inheritance 

结论 – var是语法糖: var myA = new A()等同于A myA = new A() ,其中所有OOP都与之相关。

PS:我试着用一个带有匿名类的var玩一点,并想出了这个有趣的行为 – 再次感谢nullpointer ,因为我们不能将两个推断变量分配为匿名类彼此 :

 static interface Inter { public void method(); } public static void main(String[] args) { var inter = new Inter() { @Override public void method() {System.out.println("popo");} }; inter.method(); inter = new Inter() { @Override public void method() {System.out.println("koko");} }; inter.method(); } 

并输出:

 Main.java:11: error: incompatible types:  cannot be converted to  inter = new Inter() { ^ 

由于第二个匿名类类型与第一个匿名类类型不同,对var的第二个赋值失败 – 强制执行var关键字的语法糖角色。

令人惊讶的是错误信息不再精确 – 目前它没有多大意义,因为错误中显示的类型名称是相同的!