3

汎用リストまたはパラメーター化されたリストでComparableインターフェースを使用すると、チェックされていないキャスト警告が表示されます。ObjectListを使用して比較を行うことはできますが、汎用リストを使用して比較することはできません。これが私の開発です。最初にObjectListを使用し、次に汎用リストを使用します。

これが私のListNodeクラス定義のスニペットです:

public class ListNode {
    private Object info;
    private ListNode next;

そして私のObjectListクラス定義のスニペット:

public class ObjectList {
    private ListNode list;

と私の比較可能なインターフェース:

public interface Comparable {
    public int compareTo(Object o);
}

ObjectListクラスに、ObjectパラメーターをListNode内のObjectと問題なく比較するメソッドがあります。比較コードは次のとおりです。

if (((Comparable)o).compareTo(p.getInfo()) == 0)

私は今、ジェネリックListクラスを作成し、同様の比較を行おうとしています。これが私の一般的なListNodeクラス定義のスニペットです:

public class ListNode<Type> {
    private Type info;
    private ListNode<Type> next;

ジェネリックリストクラス定義のスニペット:

public class List<Type> {
    private ListNode<Type> list;

と私の一般的な比較可能なインターフェイス:

public interface Comparable<Type> {
    public int compareTo(Type t);
}

ObjectListクラスと同じ比較を試みると、ジェネリックListクラスから以下のチェックされていないキャスト警告が表示されます。

List.java:239:警告:[チェックされていない]チェックされていないキャストが見つかりました:必要なタイプ:比較可能

if (((Comparable<Type>)t).compareTo(p.getInfo()) == 0)

何かご意見は?

簡略化したコードは次のとおりです。

public class List<Type> {
    public class ListNode<Type> {
        private Type info;
        private ListNode<Type> next;

        public ListNode() {
            info = null;
            next = null;
        }
    }

    private ListNode<Type> list;

    public List() {
        list = null;
    }

    public boolean contains(Type t) {
        ListNode<Type> p = list;
        while (p != null && (((Comparable<Type>)t).compareTo(p.info) != 0))
            p = p.next;
        return p != null;
    }
}



public interface Comparable<Type> {
        public int compareTo(Type t);
}

リストクラスへの制限付きパラメーターの追加:

public class List<Type extends Comparable<Type>> {

警告の問題を解決します。ただし、Stringオブジェクトのリストを作成すると、次のエラーが発生します。

タイプパラメータjava.lang.stringがその範囲内にありません

4

2 に答える 2

2

ComparableJDK には既にインターフェイスがあるのに、なぜ独自のインターフェイスを作成する必要があるのでしょうか? List of String の作成に失敗する理由は、単純に、String が独自の Comparable インターフェイスを持たないためです。java.lang.Comparable のみを実装しています。名前を変更するだけで、物事が明確になります。あなたがしていることは次のとおりです。

public interface MyComparable<Type> {
    public int compareTo(Type t);
}

public class MyList<Type extends MyComparable<Type>> {
  //....
}

そして、MyList<String>変数を作成しようとしています

StringMyComparableもちろん、それは問題を引き起こしています。

于 2013-02-22T02:17:49.857 に答える
1

まず、リスト宣言を以下のコードに変更します。これにより、パラメーター化されたタイプはComparableである必要があります。

List<Type extends Comparable<Type>>

t.compareTo(p.info)その後、キャストなしで直接呼び出すことができます。次に、ListNodeクラスを独自のファイルに移動します。

于 2013-02-22T00:53:00.357 に答える