0

私は初心者に過ぎず、私を助けてくれる良い魂が欲しいです;)私はこの方法を手に入れました:

( (HashSet<String>) pos[targetPos]).add(word);

それは私に例外を与えます

    (Unchecked cast from Object to HashSet<String>)

Object[pos] を String[pos] に変更してより具体的にしようとしましたが、次の行にエラーが表示されます。pos[targetPos] = new HashSet<String>();

Type mismatch: cannot convert from HashSet<String> to String

これは方法です:

public void add(String word, Object[] root){

    Object[] pos = root;
    int wordIndex = 0;
    int targetPos;

    if(word.length()>=3){
        for(int i = 1; i <=3; i++){
            targetPos = word.charAt(wordIndex) -'a'; //convert a letter into index eg a==0
            if(i==3){
                if(pos[targetPos]==null){
                    pos[targetPos] = new HashSet<String>();
                }
                ( (HashSet<String>) pos[targetPos]).add(word);
                //System.out.println(Arrays.toString(pos));
                break;

            }//end if outer if
            else{
                if(pos[targetPos]==null){
                    pos[targetPos] = new Object[28];
                }
                wordIndex++;
                pos =  (Object[]) pos[targetPos];
            }
        }//end of for
    }

}

ルートは

 Object[] root = new Object[28];
4

2 に答える 2

3

「チェックされていないキャスト」メッセージは警告です。Objectコンパイラは、 からへの明示的なキャストが実行時に安全に行われるかどうかを確認できないことを警告していHashSet<String>ます。これは、型の配列に 以外の何かが含まれている場合、JVM が実行を試みたときに を取得する可能性があることObject意味します。そのオブジェクトを type にキャストします。基本的に、コンパイラは、潜在的に安全でないことを行っていることを事前に警告しており、後で問題の原因となる可能性があります。HashSet<String>ClassCastExceptionHashSet<String>

配列の生のオブジェクトを単純に使用することはお勧めできません。配列にHashSet<String>オブジェクトのみが含まれていることを確認する場合は、おそらくそのように入力する必要があります (つまり、Set<String>[]必要に応じて実装を切り替えることができるため、型の具体的な実装の代わりにインターフェイスを使用します)。 . 明示的なキャストを行う必要があるのは、キャストするオブジェクトがキャスト先の型であることを確実に確信できる場合のみです。たとえば、インターフェイスを実装するオブジェクトがあり、そのインターフェイスの特定の具体的な実装を最も確実に処理しているクラスにいると仮定します。この場合、そのインターフェイスから具象型にキャストすることは許容されます。

メソッドは次のようになります。

public void add(String word, Set<String>[] root){

    Set<String>[] pos = root; //You probably don't even need this since you have "root"
    ...
}

また、配列の代わりに of を使用することを検討してくださいListSet<String>

public void add(String word, List<Set<String>> root){

    List<Set<String>> pos = root; //You probably don't even need this since you have "root"
    ...
}
于 2013-04-11T16:10:51.640 に答える
3

pos[]Object配列として定義されています。後でキャストするとHashSet<String>、Java はそれができることを認識しません。それがチェックされていないキャストです。コンパイラは、安全でないことをしている可能性があることを警告しています。

posのタイプをに変更することで、警告を消すことができますHashSet<String>[]

于 2013-04-11T16:11:07.043 に答える