2

リンクリストを使用して簡単な辞書ADTを作成するつもりです。getKeys()メソッドにほとんど問題はありません。コードは次のとおりです。

@Override
public K[] getKeys() 
{
    if(head==null)
    return null;
    else
    {
        Vector<K> v = new Vector();
        ListNode<K,V> temp= head;
        while(temp!=null)
        {
            v.add(temp.key);
            temp=temp.next;
        }
        //K keys[] = new O[v.size()];

        return (K[])v.toArray();//run time error
    }
}

次のエラーが発生します:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
    at Dictionary.ListDictionary.getKeys(ListDictionary.java:17)
    at Dictionary.DictionaryDriver.test(DictionaryDriver.java:83)
    at Dictionary.DictionaryDriver.main(DictionaryDriver.java:107)
Java Result: 1

これが私が実装しようとしているインターフェースです:

public interface DictionaryInterface <K extends Comparable<K>, V>
{
    public void insert(K key, V value);
    public V getValue(K str);
    public void remove(K key);
    public K[] getKeys();   
}

ジェネリックの配列を作成できないことは理解していますが、ジェネリック型を型にキャストすることに問題はありませんでした。Objectジェネリック型のK拡張と関係がありComparableますか?これを回避するにはどうすればよいですか?

4

1 に答える 1

3

次のようなものを試してください:

return (K[])v.toArray(new Comparable[v.size()]);

ただし、補足として、ジェネリックスと配列を混在させることは最善のアイデアではありません。


これを安全に行う(そして以外の型を受け入れることができるComparable)には、型参照を取得する必要があるため、コンストラクターは次のようになります。

public Dictionary(Class<K> keyType) {
    this.keyType = keyType;
}

後で、その配列をインスタンス化するときに、次を呼び出します。

return (K[]) v.toArray( Array.newInstance(keyType, v.size()) );
于 2012-09-13T07:32:55.640 に答える