【问题标题】:Why can't we assign two inferred variables as an anonymous class to each other? [duplicate]为什么我们不能将两个推断变量作为匿名类分配给彼此? [复制]
【发布时间】:2018-09-09 20:23:26
【问题描述】:

Java 10 允许使用 anonymous classvar 像:

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,但对于其他类型,如 LongString 等,它可以做同样的事情.?

【问题讨论】:

  • 因为它们相同!一个匿名类就是这样,一个继承自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 的两种不同的匿名子类型,并且两者都不是另一个的子类型。

标签: java java-10


【解决方案1】:

每个new Object(){} 创建一个新类型(匿名类)。这些类型没有子类型-超类型关系,因此不能将a1 分配给a2,反之亦然。

但是当你有两个long 变量时,它们实际上都具有相同的类型long,所以它们是可以相互赋值的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多