[英]java - Access variable in child class, given a superclass, from another class
假设我有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)
}
}
我该如何解决这个问题?
感谢您的时间。
如果确定您具有所需的实现,则需要强制转换。 但是,基本上,编译器无法从声明中得知您始终将在其中拥有boolVar
(如果始终拥有它,它将在父类中)。
如果需要特定的属性,并且所有列表项都具有特定的类型,则可能应该创建ClassBottom1和ClassBottom2的列表,以强制仅插入具有该类型和该属性的对象。 否则,它不会强制执行,您可能会出错。
这就是为什么我们首先使用泛型。 否则,它将只是对象列表(因为所有内容都是对象)。
只需输入代码,其他注释就会提出建议。
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;
}
}
您仅可以直接从boolVar
的实例或ClassBottom1
的子类访问变量ClassBottom1
。
ClassMiddle
转换将不是解决方案,因为您的ClassMiddle
不是ClassMiddle
的实例或ClassBottom1
的子类。
// will throw a ClassCastException
((ClassBottom1) construct.bottom1.get(i)).boolVar = true;
也许您可以将列表重新声明为LinkedList<ClassBottom1>
或重新考虑您的层次结构? 然后,您将可以访问变量boolVar
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.