1

私は次の抽象クラスを持っています:

public abstract class AbstractGroup {

private String name;
.
.
.
}

この抽象クラスを拡張する2つの空のクラスがあります。

public class GroupA extends AbstractGroup {
}

public class GroupB extends AbstractGroup {
}

ClassCastException:(groupタイプGroupA)を取得せずに以下をキャストする方法はありますか?

group = (GroupB)group;

このオブジェクトインスタンスがになる必要がありますGroupB

4

6 に答える 6

10

不可能です。クラスを水平方向にキャストすることはできませんが、垂直方向にのみキャストできます。GroupAのサブタイプではないGroupBため、常に例外が発生します。

于 2012-06-26T09:30:51.320 に答える
1

いいえ、できません。継承階層で上または下にキャストできます。

于 2012-06-26T09:32:09.627 に答える
1

GroupA は GroupB のインスタンスではないため、できません。どうですか:

public abstract class AbstractGroup {

  public Enum Group { GroupA, GroupB; }

  private String name;
  private Group membership;
.
.
.
}

その後:

group.setMembership(GroupB);
于 2012-06-26T09:36:59.110 に答える
1

あなたが求めているのは、キャストではなく変換です。両方の用語は、包括的な用語強制によってカバーされます。Java はオブジェクトを自動的に変換しません。これは通常、定義が不十分な問題であるため、変換しようとしても変換できませんでした。変換を行う独自のコードを作成する必要があります。変換コンストラクター、静的変換メソッド、または変換されたオブジェクトを返すソース オブジェクト内のインスタンス メソッドのいずれかの形式で作成する必要があります。

于 2012-06-26T10:24:26.067 に答える
0

いいえ、それは不可能です。しかし、別の実装からの構築を可能にするために、何らかのコンストラクターをグループに追加することをお勧めします。

public class GroupA extends AbstractGroup {
    public GroupA(AbstractGroup otherGroup) {
        this.name = otherGroup.name;
    }
}

ただし、これを行う必要がある場合は、設計が間違っている可能性があります。

于 2012-06-26T09:34:16.423 に答える
-1

次のようなことをすると可能です:

    GroupA groupAobj = new GroupA();
    AbstractGroup abstractObj = (AbstractGroup) groupAobj;
    GroupB groupBobj = (GroupB) abstractObj;

コードがコンパイルされて実行されます。

于 2012-06-27T10:39:17.543 に答える