将内部类转换为超类

时间:2012-12-21 19:59:19

标签: java casting inner-classes

我实际上是通过代码行将子类强制转换为超类。 由于特殊需要,我已经制作了一个内部类,但是我无法使用相同的代码将这个类转换为超类

实施例

((Indicator)listaIndicatori.elementAt(i)).draw(this,schermo);

作品。

((Indicator)listaIndicatori.elementAt(i)).draw(this,schermo);

不适用于内部指标类。

Inner类在指标类内声明如下

public class Bars extends JPanel

我该如何解决?

3 个答案:

答案 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访问。