我实际上是通过代码行将子类强制转换为超类。 由于特殊需要,我已经制作了一个内部类,但是我无法使用相同的代码将这个类转换为超类
实施例
((Indicator)listaIndicatori.elementAt(i)).draw(this,schermo);
作品。
((Indicator)listaIndicatori.elementAt(i)).draw(this,schermo);
不适用于内部指标类。
Inner类在指标类内声明如下
public class Bars extends JPanel
我该如何解决?
答案 0 :(得分:3)
如果内部类没有扩展外部类,则转换将不起作用:
public class Bars extends JPanel
Bars
不会延伸Indicator
。
如果Indicator
本身扩展Indicator
,则可以通过扩展JPanel
来解决此问题(直接或间接地,如果您想在{{1}上维护JPanel
继承}):
Bars
更新:但是,如果您确实需要从内部类实例访问外部类实例,则可以在public class Bars extends Indicator
内使用此方法:
Bars
并像这样使用它:
public Indicator getIndicator() {
return Indicator.this;
}
感谢Jan Dvorak在评论中指出这一点!
答案 1 :(得分:1)
将类型A的变量强制转换为类型B只有在变量确实引用其具体类型为或扩展为B的对象时才有效。
例如:
Object o = "hello";
String s = (String) o;
有效,因为变量o
引用了 一个字符串的对象。
但是在做
Object o = "hello";
Integer i = (Integer) o;
不起作用,因为o不引用整数。
很明显,将JPanel的实例强制转换为Indicator将不起作用,除非该类实际实现了Indicator接口。这门课程是否属于内部阶级并不重要。
答案 2 :(得分:1)
class Indicator {
....
class Bar extends JPanel {
....
void foo() {
((Indicator)listaIndicatori.elementAt(i)).draw(Indicator.this,schermo);
}
}
}
在Bar
内,外部类的实例由Indicator.this
访问。