java - 在给定超类的子类中从另一个类访问变量

时间:2018-04-10 12:01:37

标签: java

假设我有2个类ClassBottom1ClassBottom2,它们分别扩展了类ClassMiddle1ClassMiddle2,这两个类都扩展了另一个类ClassTop。我有2个单独的班级ClassConstructClassObserveClassObserve扩展了KeyAdapter

ClassConstruct:

LinkedList<ClassMiddle1> bottom1 = new LinkedList<ClassMiddle1>();
LinkedList<ClassMiddle2> bottom2 = new LinkedList<ClassMiddle2>();

变量bottom1bottom2分别包含ClassBottom1ClassBottom2的实例列表。

假设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)
    }
}

我该如何解决这个问题?

感谢您的时间。

3 个答案:

答案 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