1

過去 3 時間、これに対する率直な答え/解決策を見つけようとして運がなかったので、皆さんが助けてくれることを願っています:

二分探索木を使用して間隔木を実装する次のクラスがあります。

public class Node<T extends Comparable<T>> implements Comparable<Node<T>> {...}

public class BinarySearchTree<T extends Comparable<T>> {
protected Node<T> root;
...}

public class IntervalNode extends Node<Interval> {...}

public class IntervalTree extends BinarySearchTree<Interval> {...}

IntervalTree のインスタンスのルート メンバーで次のキャストを試みると、ClassCastException が発生します。

IntervalNode CurrentNode = (IntervalNode)root; //root being of type Node<Interval>
which IntervalNode extends.

私はJavaにかなり慣れていませんが、私が読んでグーグルで検索したことから、このダウンキャストが可能であるはずなので、この例外の原因についてはちょっと迷っています。これまでのところ、これは型の消去が原因であると推測していますが、この問題に関する直接的な答えを見つけることができませんでした。この例外の原因、または回避策についてのアイデアはありますか?

4

3 に答える 3

7

ここではアップキャストではなく、ダウンキャストです。IntervalNode はNode<Interval>(それを拡張するため) ですが、aNode<Interval>は必ずしも IntervalNode ではありません。

バナナはそれを伸ばすからフルーツになるのと同じように、フルーツは必ずしもバナナではありません。フルーツを持っていてそれをバナナにキャストすると、フルーツが事実上バナナである場合にのみ機能します。りんごだと失敗します。

于 2012-05-05T20:13:06.097 に答える
1

に が必要な場合は、次のようIntervalNodeにします。IntervalTree

public class BinarySearchTree<T extends Node<?>> {
    protected T root;
}

public class IntervalTree extends BinarySearchTree<IntervalNode> {

}
于 2012-05-05T20:32:50.520 に答える
0

インターフェイスを作成Nodeする (そしておそらく共通の実装を基底クラスに入れる) と、最初にやろうとしていたことをほぼ正確に行うことができます。

public interface Node<T extends Comparable<T>> extends Comparable<Node<T>> {...}
public class BaseNode<T extends Comparable<T>> implements Node<T> {...}

public class IntervalNode extends BaseNode<Interval> implements Node<Interval> {...}

Nodeすべてのsが のIntervalTreeインスタンスを使用する限り、すべてが正常に機能するはずですIntervalNode

どちらの方法でも (インターフェイスの有無にかかわらず)、 を作成するために でを作成するBinarySearchTreeものはすべてオーバーライドする必要があります。NodeIntervalTreeIntervalNode

于 2012-05-05T21:49:47.893 に答える