9

ClassCastExceptionBufferedImage(親)を自分で拡張したAdvancedBufferedImage(子)にキャストしようとすると、メソッドをオーバーライドせず、すべての請負業者を変更せずに実装しました。

ImageIO.read()メソッドを使用してファイルからAdvancedBufferedImageを作成しようとすると、この例外が発生します。

File file = new file(path);
AdvancedBufferedImage image = (AdvancedBufferedImage) ImageIO.read(file);

問題はないようですが、何が問題なのでしょうか。

4

7 に答える 7

15

このようなダウンキャストは許可されていません。

推奨される解決策は、BufferedImageをパラメーターとして使用して、AdvancedBufferedImageのコンストラクターを作成することです。これで、次のことができます。

File file = new file(path);
AdvancedBufferedImage image = new AdvancedBufferedImage(ImageIO.read(file));

ここで、AdvancedBufferedImageのコンストラクターは、BufferedImageを高度なものに適切に変換する方法を決定できます。

于 2012-08-03T15:47:03.500 に答える
4

PARENTクラスの参照がCHILDクラスまたはその派生クラスのインスタンスを保持していない限り、PARENTクラスをCHILDクラスにキャストすることはできません。

あなたの場合、は基本クラスであるImageIO.read(file)のインスタンスを返します。BufferedImageこれは、のインスタンスまたはそのサブクラスImageIO.read(file)を返す場合にのみ機能します。AdvancedBufferedImage

一部のクラスを拡張すると、派生クラスは基本クラスからいくつかのプロパティを継承しますが、基本クラスは何も取得しません。この結果、派生クラスのインスタンスには基本クラスのすべてのプロパティがあるため、基本クラスの参照は派生クラスのインスタンスを保持できます。つまり、派生クラスをBASEクラスにキャストできます。現在、派生クラスはいくつかの新しいプロパティを追加する可能性があり、基本クラスはこれらのプロパティを認識しません。したがって、BASEクラスからDERIVEDへのキャストは明らかに正しくありません。

于 2012-08-03T15:43:18.210 に答える
3

Javaでのダウンキャスト

ダウンキャスティングはこのようには機能しません。上記の投稿の回答を参照してください。BufferedImage別の方法として、によって返されたオブジェクトで構築されたクラスのインスタンスを取得して返す静的ファクトリメソッドを作成するのはImageIO.read()どうですか?

例えば:

private AdvancedBufferedImage(BufferedImage bi) {
    //  build your AdvancedBufferedImage from bi
    ...
}

public static AdvancedBufferedImage buildABI(BufferedImage bi) {
    return new AdvancedBufferedImage(bi)
于 2012-08-03T15:43:57.830 に答える
2

一般に、親クラスを子クラスにキャストすることはできません。動物を犬に強制的にキャストするようなものです。犬は動物ですが、他の方法が常に正しいとは限らないため、Javaコンパイラではそれができません。

オブジェクトの継承を参照してください。

于 2012-08-03T16:06:26.150 に答える
2

ダウンキャストは許可されますが、子の実際のインスタンスである必要があります。

class A {
  String name = "a";
  A(){};
}

class B extends A {
}

public class Main {
  public static void main(String[] args) {
    A a = new B(); // must a b instance
    B b = new B();
    b = (B)a;
    System.out.println(b.name);

  }
}
于 2016-06-29T06:45:10.887 に答える
0

BufferedImage ではない AdvancedBufferedImageので、キャストは失敗します。

の機能を拡張できますBufferedImageが、readメソッドはそれでも。のみを返しますBufferedImage。キャストによって、参照が目的のタイプになったり、目的のタイプとして動作したりすることはありません。

あなたはおそらくBufferedImageあなたのAdvancedBufferedImageクラスでラップしたいと思うでしょう、そしてあなたはあなたの上級クラスを回して操作することができます。

于 2012-08-03T15:44:01.470 に答える
-1

ダウンキャストは、キャストしようとしているオブジェクトが実際にキャスト先のクラスのインスタンスである場合にのみ成功します。

于 2012-08-03T15:41:14.203 に答える