引用内部字段 Class
Referencing fields of an Inner Class
我是 java 的新手,正在尝试了解匿名内部 类 的工作原理。
Object a = new Object(){
Object b = new Object(){
String c = "Hi!";
};
};
System.out.println( a.b.c );
当我尝试 运行 上面的代码时,出现 'cannot find symbol' 错误。有人可以解释一下为什么会出现此错误以及如何引用字符串 c.
(我尝试 'a possibly weird' 的原因是我想以分层方式组织小部件句柄,如 'ui.menu.file.open'。)
这里b
和c
是匿名classes的字段,但是你不能在匿名classes之外引用它们作为[=的类型24=] 是 Object
而 Object
class 没有这些字段。
虽然在匿名 class 本身内部引用这些字段是合法的,例如:
Object a = new Object(){
Object b = new Object(){
String c = "Hi!";
@Override
public String toString(){
return c;
}
};
};
为了解决您的需求(访问自定义字段),您不应使用匿名 classes,而应使用您自己的 classes 来呈现预期的结构,例如:
public class A{
public B b = new B();
}
public class B{
public String c = "Hi";
}
所以你可以这样写(虽然根本不推荐 public 实例字段):
String c = new A().b.c;
虽然 dynamic 类型的变量 a
是具有字段 c
的匿名类型,但其 static 类型是 Object
,它没有字段 c
.
一旦 Java 引入了隐式派生类型的 var
声明,您就可以解决这个问题。不幸的是,this wouldn't be available until Java 10:
// ** WARNING ** This would not compile until Java 10
var a = new Object() {
String c = "Hi!";
};
System.out.println( a.c );
在那之前,您必须为匿名对象声明一个通用类型,并让它公开您需要的属性:
interface HasMyProperty {
String getC();
}
interface HasMyObject {
HasMyProperty getB();
}
...
HasMyObject a = new HasMyObject() {
HasMyProperty b = new HasMyProperty() {
private final String c = "Hi!";
@Override
public string getC() { return c; }
};
@Override
public HasMyProperty getB() { return b; }
};
System.out.println( a.getB().getC() );
我是 java 的新手,正在尝试了解匿名内部 类 的工作原理。
Object a = new Object(){
Object b = new Object(){
String c = "Hi!";
};
};
System.out.println( a.b.c );
当我尝试 运行 上面的代码时,出现 'cannot find symbol' 错误。有人可以解释一下为什么会出现此错误以及如何引用字符串 c.
(我尝试 'a possibly weird' 的原因是我想以分层方式组织小部件句柄,如 'ui.menu.file.open'。)
这里b
和c
是匿名classes的字段,但是你不能在匿名classes之外引用它们作为[=的类型24=] 是 Object
而 Object
class 没有这些字段。
虽然在匿名 class 本身内部引用这些字段是合法的,例如:
Object a = new Object(){
Object b = new Object(){
String c = "Hi!";
@Override
public String toString(){
return c;
}
};
};
为了解决您的需求(访问自定义字段),您不应使用匿名 classes,而应使用您自己的 classes 来呈现预期的结构,例如:
public class A{
public B b = new B();
}
public class B{
public String c = "Hi";
}
所以你可以这样写(虽然根本不推荐 public 实例字段):
String c = new A().b.c;
虽然 dynamic 类型的变量 a
是具有字段 c
的匿名类型,但其 static 类型是 Object
,它没有字段 c
.
一旦 Java 引入了隐式派生类型的 var
声明,您就可以解决这个问题。不幸的是,this wouldn't be available until Java 10:
// ** WARNING ** This would not compile until Java 10
var a = new Object() {
String c = "Hi!";
};
System.out.println( a.c );
在那之前,您必须为匿名对象声明一个通用类型,并让它公开您需要的属性:
interface HasMyProperty {
String getC();
}
interface HasMyObject {
HasMyProperty getB();
}
...
HasMyObject a = new HasMyObject() {
HasMyProperty b = new HasMyProperty() {
private final String c = "Hi!";
@Override
public string getC() { return c; }
};
@Override
public HasMyProperty getB() { return b; }
};
System.out.println( a.getB().getC() );