簡體   English   中英

Hashtable Java中Long的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM