2013-02-26 46 views
0

顯然,我無法在散列表中存儲Long值。在哈希表中存在長問題Java

請參見下面的代碼:

//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()方法如下 -

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 

我不清楚爲什麼是這樣的情況。首先,不需要輸入nHeads。但我仍然這樣做,它不起作用。

注意:我根本不擅長Java。 :/

感謝您的幫助。

+2

哈希表是不是在DoFlip通用的,警告是不是一個錯誤。 – 2013-02-26 03:19:37

+0

「散列表在DoFlip中不是通用的」您能否詳細說明一下?此外,我明白這是一個警告(正如我提到的那樣)。我想明白爲什麼會發生這種情況。 – p0lAris 2013-02-26 03:21:42

+0

@DaveNewton:明白了。非常感謝。 – p0lAris 2013-02-26 03:24:14

回答

3

此警告表明您正在使用原始類型。更換

DoFlip(long iterations, Hashtable table){ 

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

使得它含有類似universalTable仿製藥。在初始聲明中還包括泛型。

旁註:

  • Hashtable是一個很老的CollectionHashMap已被替換。
+0

這也有幫助。我有兩個通用聲明。謝謝。 – p0lAris 2013-02-26 03:26:01

+0

謝謝你的頭像。至於'DoFlip'而不是'doFlip','DoFlip'是一個靜態類,因此也就是構造函數。 – p0lAris 2013-02-26 03:35:10

3

這只是一個警告,告訴你,你是混合通用和非通用容器。這是允許的,但如果在代碼中使用泛型,編譯器可以在類型檢查方面做得更好。

要解決此警告,您需要更改

Hashtable table; 

Hashtable<String, Long> table; 

在聲明中DoFlip

+0

這有幫助。謝謝 – p0lAris 2013-02-26 03:24:49

1

我的2美分:

首先,如果你正在建設一些性能敏感的應用程序,你想避免長和長原始之間的轉換,可以考慮使用trove4j收藏庫。這是一個質量很好的原始人。

其次,你的DoFlip應該被宣佈爲

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

和問題就解決了。

享受。

+0

是的,我正在構建一個基於性能的應用程序。將注意到trove4j。謝謝。 – p0lAris 2013-02-26 03:25:15

0

您需要向編譯器保證您的HashMap全部來自Strings to Longs。你們這樣做是在這裏:

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中,因爲現在編譯器可以檢查你是否總是使用你想要的(即括號中指定的)。

+0

是的,我解決了它。謝謝! – p0lAris 2013-02-26 03:26:38

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 
}