我有一个超类A,两个类X,Y继承自A和另一个B类,我将使用X,Y作为成员。
public class A {
public String strA;
}
public class X extends A {
public String strX;
}
public class Y extends A {
public String strY;
}
public class B {
public A member;
public B(A member) {
this.member=member;
}
}
public static void main() {
X x = new X();
Y y = new Y();
B b1 = new B(x);
B b2 = new B(y);
System.out.println(b1.strA); //works
System.out.println(b1.strX); //does not work!
System.out.println(b2.strA); //works
System.out.println(b2.strX); //does not work!
}
我该如何解决这个问题?
我的方法是使用B中成员的数据类型作为占位符吗?
谢谢!
答案 0 :(得分:0)
您的代码无法按照Jon Skeet的说法编译,因为您正在尝试访问B字段中的字段。
要编译,代码将是
System.out.println(b1.member.strA); //works
您必须在此处使用继承实例中的字段,明确地展示您的member
引用。
如果您使用的是对母类的引用,它只会向您显示可从母类访问的字段。
在这种情况下,只有strA
引用才能访问A
。
System.out.println(((X)b1.member).strX);
如您所见,首先我们将b1.member
投射到X
,然后我们调用strX
字段。
如果您想确保b1.member
是X
的实例,请使用if this test
if (b1.member instanceof X) System.out.println(((X)b1.member).strX);