当前位置: 首页 > 面试题库 >

为什么Diamond不能推断匿名内部类的类型?

唐阳飙
2023-03-14
问题内容

在Java 7和更高版本中,菱形通常可以像这样毫无问题地用于推断类型:

List<String> list = new ArrayList<>();

但是,它不能用于这样的匿名内部类:

List<String> st = new List<>() { //Doesn't compile

    //Implementation here

}

为什么是这样?从逻辑上讲,在这种情况下,我绝对可以将类型推断为String。做出该决定的逻辑上的理由是,实际上不能在匿名内部类上推断类型,还是出于其他原因而将其省略了?


问题答案:

在JSR-334中:

不支持将Diamond与匿名内部类一起使用,因为这样做通常需要扩展类文件签名属性以表示不可表示的类型,这实际上是JVM的更改。

我想是众所周知的,匿名类导致生成自己的类文件。

我想这些文件中不存在泛型类型,而是由有效(静态)类型代替了(因此由显式类型声明,例如<String>在声明对象时)。

确实,与内部类相对应的文件永远不会在其多个不同的实例之间共享,那么为什么要对它使用泛型呢?:)。

对于编译器来说,将这些类文件强制扩展(通过为泛型添加特殊属性)是很难实现的(并且肯定是无用的)。



 类似资料:
  • 问题内容: 就在今天,我需要一种在不同对象之间传递函数的方法。我很快了解到您不能直接在Java中做到这一点,但是您可以传递一个wht实例,该实例显然被称为“匿名内部类”,如下所示: 定义类: 使其成为一个实例: 并称之为: 很简单。但是我不明白的是为什么它被称为“匿名”。我不只是给它起名字MyCallback吗?命名的东西不能匿名,对吗?请避免对这个术语感到困惑。 问题答案: 不,您说的是MyCa

  • 问题内容: 如果我有以下课程: 我显然可以实例化该对象,并且我知道必须进行某种子类化,因为我可以覆盖Hooray方法,但是如果有子类化,为什么我不能在匿名类内创建一个新方法? 返回语法错误 问题答案: 您可以创建方法,方法没有任何问题(除了它的前面有一个大写字母之外)。问题在于,在匿名类之外,Boo方法不可用(它没有作为类API的一部分公开)。 这与实现接口的任何类都是相同的…如果该类具有不属于接

  • 问题内容: 考虑下面的Java代码,它尝试实例化一些: 并且很简单;在Java 7中使用新的Diamond运算符来减少不必要的类型参数重复。 是使用匿名类的一种变体,可能会覆盖的某些方法。 尝试使用菱形运算符,类似于,但这是编译错误,消息 “ <>”不能与匿名类一起使用。 产生一个错误,证明编译器知道实际需要的类型。错误消息是 类型不匹配:无法从新的ArrayList (){}转换为List 因此

  • 为什么我不能这样做/是否有解决方法来实现这一点: 这两个编译错误是 > On

  • 问题内容: 在进行一些基本的lambda练习时,一个看似完全相同的匿名内部类的输出给我的输出与lambda不同。 场景1 输出 2 和 2 。这里没有新内容。 但是当我这样做时: 场景2 输出 2 和 3 问题:两个输出不应该相同吗? 我想念什么吗? 为了完整起见: 方案3 输出 3 和 3 。这里也没有什么新鲜的。 更新:仍从1.8.0-b132获得相同的输出 更新#2:错误报告: https

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除