繁体   English   中英

java-子类的访问变量(给定超类)来自另一个类

[英]java - Access variable in child class, given a superclass, from another class

假设我有2个类ClassBottom1ClassBottom2 ,分别扩展了ClassMiddle1ClassMiddle2类,这两个类都扩展了另一个ClassTop 我有2个单独的类ClassConstructClassObserve ClassObserve扩展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)
    }
}

我该如何解决这个问题?

感谢您的时间。

如果确定您具有所需的实现,则需要强制转换。 但是,基本上,编译器无法从声明中得知您始终将在其中拥有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM