【发布时间】:2018-09-09 20:23:26
【问题描述】:
Java 10 允许使用 anonymous class 和 var 像:
var a1 = new Object(){};
var a2 = new Object(){};
但是这个赋值会抛出错误:
a1 = a2;
jshell> a1 = a2; | Error: | incompatible types: $1 cannot be converted to $1 | a1 = a2; | ^^
基于错误日志,为什么 Java 10 不能将两个推断的 vars 分配给彼此作为 anonymous class,但对于其他类型,如 Long、String 等,它可以做同样的事情.?
【问题讨论】:
-
因为它们不相同!一个匿名类就是这样,一个继承自
Object的匿名class- 一个是Object$1,另一个是Object$2。这就像问为什么不能将ArrayList分配给HashSet。 -
@BoristheSpider 他们都是
$1吗?来自错误日志:$1 cannot be converted to $1 -
这似乎是 jshell 错误消息的更多问题。
javac使用<anonymous Object> cannot be converted to <anonymous Object>(但不一定是 same<anonymous Object>) -
$1 cannot be converted to $1看起来像错误。当我们删除a1 = a2;赋值并编译这样的代码时,我们将(如预期)得到两个带有$1和$2后缀的匿名类。所以预期的错误信息应该更像$2 cannot be converted to $1。 -
因为它们不是同一类型。它们是
Object的两种不同的匿名子类型,并且两者都不是另一个的子类型。