Hashtable Java中的Long问题

时间:2013-02-26 03:17:22

标签: java hashtable long-integer

显然,我无法在哈希表中存储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()方法如下 -

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。 :/

感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

此警告表示您使用的是原始类型。取代

DoFlip(long iterations, Hashtable table){

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

这样它包含类似于universalTable的泛型。还包括初始声明中的泛型。

旁注:

  • Hashtable是一个相当古老的Collection,已被HashMap取代。

答案 1 :(得分:3)

这只是一个警告,告诉您正在混合通用和非通用容器。这是允许的,但如果在代码中的任何地方使用泛型,编译器可以更好地进行类型检查。

要修复此警告,您需要更改

Hashtable table;

Hashtable<String, Long> table;

DoFlip内的声明中。

答案 2 :(得分:1)

我的2美分:

首先,如果要构建一些性能敏感的应用程序,并且希望避免Long和long原语之间的转换,请考虑使用trove4j集合库。它是一个基于原始的,质量很好的。

其次,您的DoFlip应声明为

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

问题解决了。

享受。

答案 3 :(得分:0)

你需要向编译器保证你的HashMaps都是从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中,因为现在编译器可以检查你是否总是使用你想要的那些(即括号中指定的那些。

答案 4 :(得分:0)

这只是编译器发出的mixing generic and non-generic containers

警告

您可以执行以下任一步骤以使其消失

1)你需要改变

Hashtable table;

Hashtable<String, Long> table;

OR

2)您可以使用SuppressWarning注释来禁止警告

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