[英]Issues with Long in Hashtable Java
顯然,我無法在哈希表中存儲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 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。 :/
謝謝您的幫助。
此警告表明您正在使用原始類型。 更換
DoFlip(long iterations, Hashtable table){
與
DoFlip(long iterations, Hashtable<String, Long> table) {
這樣它就包含類似於universalTable
的泛型。 還應在初始聲明中包含泛型。
邊注:
Hashtable
是一個相當老的Collection
,已由HashMap
取代。 這只是一個警告,告訴您正在混合通用容器和非通用容器。 這是允許的,但是如果您在代碼的任何地方都使用泛型,則編譯器可以在類型檢查方面做得更好。
要解決此警告,您需要進行更改
Hashtable table;
對於
Hashtable<String, Long> table;
在DoFlip
內的DoFlip
。
我的2美分:
首先,如果要構建一些對性能敏感的應用程序,並且希望避免在Long和long原語之間進行轉換,請考慮使用trove4j集合庫。 它是基於原始的,質量很高。
其次,您的DoFlip應該聲明為
DoFlip(long iterations, Hashtable<String, Long> table){
this.iterations = iterations;
this.table = table;
}
問題解決了。
請享用。
您需要向編譯器保證,您的HashMap都是從Strings到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
中,因為現在編譯器可以檢查您始終使用所需的對象(即括號中指定的對象)。
這只是來自編譯器的警告,提示您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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.