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

为什么在Java中将公共字段添加到匿名类不起作用?

段兴为
2023-03-14
问题内容

我有一个示例类,如下所示:

public class FooBar {

  void method1(Foo foo){ // Should be overwritten
    ...
  }

}

稍后,当我尝试这样做时:

FooBar fooBar = new FooBar(){
  public String name = null;
  @Override
  void method1(Foo foo){
    ...
  }
};

fooBar.name = "Test";

我收到一条错误消息,说名称字段不存在。为什么?


问题答案:

因为 类型 的变量"fooBar"FooBar(在 运行时类型 的的 对象 ,在所述变量是实现匿名类的FooBar这也是一个
亚型FooBar)…

…并且该类型FooBar没有该成员。因此,出现编译错误。(请记住,该变量"fooBar"可以包含符合的任何对象FooBar,即使没有的对象name也是如此,因此编译器会拒绝不是类型安全的代码。)

编辑:对于一种解决方案,请参见irreputable的答案,该答案使用 Local Class
Declaration
来创建新的
命名类型 (以替换帖子中的 匿名类型 )。

Java 支持执行此操作的方法(主要是:Java不支持有用的类型推断),尽管以下内容可以实现,即使不是很有用:

(new foobar(){
  public String name = null;
  @Override
  void method1(Foo foo){
    ...
  }
}).name = "fred";

快乐的编码。

Scala和C#都支持所需的类型推断,从而支持局部变量的匿名类型专门化。(尽管C#不支持匿名扩展现有类型)。但是,Java没有。



 类似资料:
  • 今天我对封装感兴趣,对此我有一个基本问题。我理解为什么需要为私有字段添加setter和getter方法。但我看到为public int编写,字符串是其他的setter和getter。为什么我们需要为公共字段添加属性?我已经可以从任何地方访问公共变量。你怎么能用塞特和盖特控制我?谢谢

  • 我正在构建一个Angular4项目,并使用IntelliJ。每当我创建一个新类,然后添加getter和setter时。IDE向字段添加下划线。 由于typescript语法似乎可以被IDE自动识别,但却以这种方式创建字段,因此我认为这是一种最佳实践,但我也读到过这样做是不应该的。 IDE为什么要这样做?我应该允许它为一个有角度的项目这样做吗?谢谢你的帮助! 在创建getter和setter之前 在

  • 问题内容: 在Java中,文件名应与该文件中包含的文件名相同。为什么会有限制?它有什么作用? 问题答案: Java有一个有趣的方法:给程序员一个选择只能降低编程经验,而不必选择。 他们在很多地方都这样做。确保使用文件名和软件包,但不允许在文件中使用多个公共类(从来没有),不允许您在文件之间拆分类(该死,很难使用!),等等。 我真的希望他们走得更远。没有理由使用公共变量:我从来不需要一个变量,也从未

  • 请考虑以下 Java 代码: 在上面的代码中,可以从任何地方访问数据的值。那么,为什么不将现场数据公开呢?

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

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