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拡張する場合):JPanelJPanelBars

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

型 A の変数を型 B にキャストすることは、その変数が具体的な型が B であるか、B を拡張するオブジェクトを実際に参照している場合にのみ機能します。

例えば:

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

変数は文字列であるオブジェクトを参照するため、機能oます。

しかし、やっている

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

o は整数を参照しないため、機能しません。

したがって、クラスが実際に Indicator インターフェースを実装しない限り、JPanel のインスタンスを Indicator にキャストしても機能しません。クラスが内部クラスであるかどうかは関係ありません。

于 2012-12-21T20:06:25.610 に答える
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 に答える