假设我有2个类ClassBottom1
和ClassBottom2
,它们分别扩展了类ClassMiddle1
和ClassMiddle2
,这两个类都扩展了另一个类ClassTop
。我有2个单独的班级ClassConstruct
和ClassObserve
。 ClassObserve
扩展了KeyAdapter
。
ClassConstruct:
LinkedList<ClassMiddle1> bottom1 = new LinkedList<ClassMiddle1>();
LinkedList<ClassMiddle2> bottom2 = new LinkedList<ClassMiddle2>();
变量bottom1
和bottom2
分别包含ClassBottom1
和ClassBottom2
的实例列表。
假设ClassBottom1
有一个名为boolVar
的布尔变量,评估为false
。我将如何从以下位置访问此变量:
ClassObserver:
private ClassConstruct construct;
public ClassObserver(ClassConstruct construct) {
this.construct = construct;
}
public void keyPressed(KeyEvent e) {
for (int i = 0; i < construct.bottom1.size(); i++) {
construct.bottom1.get(i).boolVar = true; // throws an error, as boolvar does't exist in class (ClassMiddle1)
}
}
我该如何解决这个问题?
感谢您的时间。
答案 0 :(得分:0)
如果您确定自己拥有所需的实施,则需要进行投射。但基本上编译器无法从声明中知道你总是会有boolVar
(如果你总是拥有它,那么它将在父类中)。
如果您需要特定属性并且所有列表项都具有特定类型,则可能应创建ClassBottom1和ClassBottom2列表以强制仅插入具有该类型和该属性的对象。否则它不会被强制执行,你可能会出错。
这就是为什么我们首先要有仿制药。否则它只是对象列表(因为一切都是对象)。
答案 1 :(得分:0)
只需输入代码,其他评论建议。
public void keyPressed(KeyEvent e) {
for (int i = 0; i < construct.bottom1.size(); i++) {
ClassMiddle1 m1 = construct.bottom1.get(i);
if(m1 instanceof ClassBottom1)
((ClassBottom1)m1).boolVar = true;
}
}
答案 2 :(得分:0)
您可以直接从boolVar
的实例或ClassBottom1
的子类访问变量ClassBottom1
。
Casting不是一个解决方案,因为ClassMiddle
不是ClassBottom1
的实例或其子类。
// will throw a ClassCastException
((ClassBottom1) construct.bottom1.get(i)).boolVar = true;
也许,您可以将列表重新声明为LinkedList<ClassBottom1>
或重新考虑您的层次结构?
然后,您就可以访问变量boolVar
。