为什么在Java中将公共字段添加到匿名类不起作用?
|
我有一个示例类,如下所示:
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\";
我收到一条错误消息,说名称字段不存在。为什么?
没有找到相关结果
已邀请:
8 个回复
熊融炭臀陛
的类型是
(该变量中对象的运行时类型是实现
的匿名类的对象,运行时类型也是
的子类型)... ...而类型
没有该成员。因此,出现编译错误。 (请记住,变量
可以包含任何符合
的对象,即使没有ѭ9的对象也是如此,因此编译器会拒绝不是类型安全的代码。) 编辑:对于一种解决方案,请参见irreputable的答案,该答案使用本地类声明创建新的命名类型(以替换帖子中的匿名类型)。 Java不支持执行此操作的方法(主要是:Java不支持有用的类型推断),尽管以下内容确实起作用,即使不是很有用:
快乐的编码。 Scala和C#都支持所需的类型推断,从而支持局部变量的匿名类型专门化。 (尽管C#不支持匿名扩展现有类型)。但是,Java没有。
耐扫鹤胶鞭
信藉乒
和
结果:
或者,您可以在Java 10或更高版本中像这样使用
。
艾食魄轻县
是对类型
的对象的引用,并且此类对象没有字段
。就那么简单。而且,由于它是匿名类型,所以引用该字段的唯一方法是通过其“ѭ20”引用。
峨躬坎抬焚
梦砍废么
类型是
,它没有这样的变量,因此代码无法编译。您可以通过反射访问它。
庞协腿宛炯
类不包含
。因此它将无法正常工作。 我想指出匿名类的建议用法。 匿名类(或接近Closures,可能是lambdas。类似但不相同)来自功能编程范例,在该范例中状态应该是不可变的。 话虽这么说,为什么还要使用此类课程呢?当您需要快速而简短的事情来完成时,不一定要参加完整的课程。例:
了解仅将实现包含在一个函数/类中的理解很重要。
,无法从其他程序代码访问。 因此,您不应(也不能)设置set29ѭ
弓萍功