1

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

例子

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

作品。

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

不适用于内部指标类。

Inner 类在指标类中声明如下

public class Bars extends JPanel

我该如何解决?

4

3 回答 3

3

如果内部类不扩展外部类,则强制转换不起作用:

public class Bars extends JPanel

Bars不延长Indicator

你可以通过扩展来解决这个问题Indicator,如果Indicator它本身扩展JPanel(直接或间接,如果你想保持JPanel继承Bars):

public class Bars extends Indicator

更新:但是,如果您确实需要从内部类实例访问外部类实例,您可以在内部使用此方法Bars

public Indicator getIndicator() {
  return Indicator.this;
}

并像这样使用它:

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

感谢 Jan Dvorak 在评论中指出这一点!

于 2012-12-21T20:05:53.137 回答
1
class Indicator {
  ....
  class Bar extends JPanel {
    ....
    void foo() {
      ((Indicator)listaIndicatori.elementAt(i)).draw(Indicator.this,schermo);
    }
  }
}

在内部Bar,外部类的实例由 访问Indicator.this

于 2012-12-21T20:08:12.810 回答
1

仅当变量确实引用了具体类型为 B 或扩展 B 的对象时,才能将 A 类型的变量转换为 B 类型。

例如:

Object o = "hello";
String s = (String) o;

有效,因为变量o引用了一个字符串对象。

但是做

Object o = "hello";
Integer i = (Integer) o;

不起作用,因为 o 不引用整数。

很明显,将 JPanel 的实例转换为 Indicator 是行不通的,除非该类实际实现了 Indicator 接口。该类是否是内部类无关紧要。

于 2012-12-21T20:06:25.610 回答