0

チェックされていないキャストの警告が表示されます。警告を解決する方法がわかりません。

コンパイラ エラーlist = (E[]) new IntKeyed [size];
は、文字ごとに使用すると想定されるコードを選択しているようです。
ジェネリックを使用しようとしているため、「E」です。

したがって、このコードのどこかでおかしくなったに違いないと思います。エラーを調べたところ、 に対処しているように見えましたが、私の知る限りArrayListsでは を使用していません。ArrayList

多分私はすべきArrayListsですか?それを変更すると、警告が修正されますか? また、コードの例外処理が不完全であるという問題もあります。しかし、それはアレイの問題から切り離されていると思います。

あなたが見つけることができるエラーは、私を正しい方向に向けるのに役立ちます. ありがとう。

public abstract class MyArrayList<E> implements IntKeyed
{

private final int DEFCAP = 50;
private int origCap;
private int numElements;
private E[] list;

public MyArrayList()
{
    origCap = DEFCAP;
    list = (E[]) new IntKeyed [origCap];    *******Error Here
}

public MyArrayList( int size ) throws Exception
{
    size = DEFCAP;
    if( size > 0 )
    {
        list = (E[]) new IntKeyed [size];    *******Error Here
        origCap = size;
    }
    else
    {
        throw new ArrayStoreException();
        System.out.println("List size is invalid");
    }
    list = (E[]) new IntKeyed [size];         *******Error Here
}

private void enlarge ()
{
    E[] larger = (E[]) new IntKeyed [list.length + origCap]; *******Error Here
    for( int i = 0; i < list.length; i++)
    {
        larger[i] = list[i];
    }
    list = larger;
}

でコンパイルすると、次のjavac -Xlint:unchecked MyArrayList.java ようになります。

MyArrayList.java:29: warning: [unchecked] unchecked cast
    list = (E[]) new IntKeyed [origCap];
                 ^
required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:37: warning: [unchecked] unchecked cast
        list = (E[]) new IntKeyed [size];
                     ^
required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:45: warning: [unchecked] unchecked cast
    list = (E[]) new IntKeyed [size];
                 ^
 required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:117: warning: [unchecked] unchecked cast
    E[] larger = (E[]) new IntKeyed [list.length + origCap];
                       ^
required: E[]
found:    IntKeyed[]
where E is a type-variable:
E extends Object declared in class MyArrayList
MyArrayList.java:43: error: unreachable statement
        System.out.println("List size is invalid");
        ^
1 error
4 warnings
4

2 に答える 2

1

警告は問題ではありません。問題は、例外をスローした後に到達できないステートメントです。

このようにする必要があります:

System.out.println("List size is invalid");
throw new ArrayStoreException();

キャストが機能すると思われる場合は、@SuppressWarnings("unchecked")メソッドまたはステートメント レベルで追加します (スコープが小さいほど良い)。コンパイラはメッセージを発行しませんが、キャストが間違っていると実行時に例外が発生します。

于 2013-10-15T09:12:40.603 に答える
1

実質的に警告list = (E[]) new IntKeyed [origCap];は、ジェネリックEがハードコードされていることを意味するIntKeyedため、何を渡してもElist常に type のままになりますIntKeyed

あなたの場合、この目的のために特定のインターフェースをすでに実装しているため、一般的な使用は適していないようです。

于 2013-10-15T09:15:28.130 に答える