0

どうやら、ハッシュテーブルに Long 値を格納できません。

以下のコードを参照してください。

//create a hashtable of type <String, Long>
Hashtable <String, Long> universalTable = new Hashtable <String, Long> ();

universalTable.put("HEADS", new Long(0)); // this works fine

のコンストラクターでこのテーブルを渡しますDoFlip

DoFlip doFlip = new DoFlip(100000000, universalTable);

内部DoFlip:

Hashtable table; // pointer to hash map
long iterations = 0; // number of iterations

DoFlip(long iterations, Hashtable table){
    this.iterations = iterations;
    this.table = table;
}

このクラスは Runnable を実装します。方法は次のrun()とおりです—</p>

public void run(){
    while(this.iterations > 0){
        // do some stuff
        this.heads ++;
        this.iterations --;
    }
    updateStats();
}

public void updateStats(){
    Long nHeads = (Long)this.table.get("HEADS");
    this.table.put("HEADS", nHeads); // ISSUE HERE
}

次の警告/エラーが表示されます。警告のように見えますが、私はこれを望んでいません。

Note: File.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

再コンパイルすると:

File.java:92: warning: [unchecked] unchecked call to put(K,V) as a member of the raw type java.util.Hashtable
            this.table.put("HEADS", nHeads);
                          ^
1 warning

なぜそうなのかはわかりません。まず、 cast と入力する必要はありませんnHeads。しかし、私はまだそれを行っていますが、うまくいきません。

注: 私は Java がまったく得意ではありません。:/

助けてくれてありがとう。

4

5 に答える 5

3

この警告は、生の型を使用していることを示しています。交換

DoFlip(long iterations, Hashtable table){

DoFlip(long iterations, Hashtable<String, Long> table) {

と同様のジェネリックが含まれるようにしuniversalTableます。また、初期宣言にジェネリックを含めます。

サイドノート:

  • Hashtableはかなり古くCollection、 に置き換えられましたHashMap
于 2013-02-26T03:21:19.687 に答える
3

これは単なる警告であり、汎用コンテナーと非汎用コンテナーが混在していることを示しています。これは許可されていますが、コードのあらゆる場所でジェネリックを使用すると、コンパイラは型チェックをより適切に行うことができます。

この警告を修正するには、変更する必要があります

Hashtable table;

為に

Hashtable<String, Long> table;

内の宣言でDoFlip

于 2013-02-26T03:21:30.153 に答える
1

私の2セント:

まず、パフォーマンスに敏感なアプリケーションを構築していて、Long と long プリミティブ間の変換を避けたい場合は、trove4jコレクション ライブラリの使用を検討してください。プリミティブをベースにクオリティの高い一台です。

次に、DoFlip を次のように宣言する必要があります。

DoFlip(long iterations, Hashtable<String, Long> table){
    this.iterations = iterations;
    this.table = table;
}

そして問題は解決しました。

楽しみ。

于 2013-02-26T03:22:23.027 に答える
0

HashMap がすべて String から Long であることをコンパイラに確認する必要があります。あなたはここでそれをしました:

Hashtable <String, Long> universalTable = new Hashtable <String, Long> ();

...しかし、ここではありません:

Hashtable table; // pointer to hash map
---
DoFlip(long iterations, Hashtable table){

そうする:

Hashtable<String, Long> table;
---
DoFlip(long iterations, Hashtable<String, Long> table){

...そして、実行時に間違ったタイプのオブジェクトを配置する自動化されたパニックはもうありません。これは、table意図したオブジェクト (つまり、括弧内に指定されたオブジェクト) を常に使用することをコンパイラがチェックできるためです。

于 2013-02-26T03:24:47.450 に答える
0

これは、コンパイラからの警告です。mixing generic and non-generic containers

次のいずれかの手順を実行して、それを非表示にすることができます

1) 変更する必要があります

Hashtable table;

為に

Hashtable<String, Long> table;

また

2) SuppressWarning アノテーションを使用して警告を抑制することができます

@SuppressWarnings("unchecked")
public void updateStats(){
    Long nHeads = (Long)this.table.get("HEADS");
    this.table.put("HEADS", nHeads); // ISSUE HERE
}
于 2013-02-26T03:32:35.187 に答える