16

我正在尝试找到一种方法将类的新实例存储为 Java 哈希图中的值。这个想法是由一位 Java 讲师给我的,目的是创建一个可用于我正在开发的程序的数据存储结构。

他向我推荐的想法是使用存储计算机名称作为键的哈希图,值将是类 InfoStor.class 的新实例。InfoStor 包含 getName()、setName()、getMemory() 等方法...

我已经为基本测试设置了类和方法,以查看它是否有效。我遇到的问题是,一旦我在哈希图中创建了一个新条目,我就无法弄清楚如何使用 InfoStor 中的方法。

这是我到目前为止的代码;

VMware.class

import java.util.HashMap;

public class VMware {

    public static void main(String[] args) {                       
        HashMap <String, Object> mapper = new HashMap();            
        mapper.put("NS01", new InfoStor("NS01"));            
        //mapper.get("NS01").            
    }            
}

信息存储类

public class InfoStor {

    private String vmName;
    private String platform;
    private Integer memory;

    public InfoStor (String name) {
        vmName = name;
    }

    String getName(){
        return vmName;
    }

    void setPlatform(String p){
        platform = p;
    }

    String getPlatform(){
        return platform;
    }

    void setMemory(Integer m){
        memory = m;
    }

    Integer getMemory(){
        return memory;
    }
}

我想要完成的是这样的(基本想法)。

Object var = mapper.get("NS01");    
System.out.println(var.getMemory());

我会以错误的方式解决这个问题吗?感谢任何帮助。

4

5 回答 5

22

问题是您的代码仅指定地图中的值是Object. 你知道的远不止这些,所以告诉编译器这些信息:

HashMap<String, InfoStor> mapper = new HashMap<String, InfoStor>();
mapper.put("NS01", new InfoStor("NS01"));
...

InfoStor value = mapper.get("NS01");
Integer memory = value.getMemory();

请注意,对变量类型使用接口通常虽然并不总是更好 - 您可以使用菱形运算符进行构造函数调用,让编译器使用类型推断来填充类型参数:

Map<String, InfoStor> mapper = new HashMap<>();
mapper.put("NS01", new InfoStor("NS01"));
...

InfoStor value = mapper.get("NS01");
Integer memory = value.getMemory();
于 2012-08-23T21:00:44.623 回答
10

如果您像这样声明您的哈希图:

HashMap<String, InfoStor> mapper = new HashMap<String, InfoStor>();

然后,当您从映射器中获取一个对象时,它将是一个实例InfoStor(您不需要转换它或担心类转换异常,因为它不是 rist 类。)

所以:

InfoStor myStor = mapper.get("somekey");
myStor.getMemory(); // this will work

否则,如果您坚持HashMap<String, Object>使用原始代码中使用的方法,则需要在调用方法之前对其进行转换:

Object obj = mapper.get("somekey");
((InfoStor)obj).getMemory(); // cast is required
obj.getMemory(); // this will not compile

您应该阅读 Java 泛型。

于 2012-08-23T21:00:19.927 回答
1

使用添加到 java.util 中的泛型。它们有助于编译时类型检查,并使强制转换变得不必要。

  HashMap <String, Object> mapper = new HashMap();
  //you will be able to retrieve an object and then cast it to your InfoStore
  InforStore isN01 = (InfoStore)mapper.get("N01");

  //this will unfortunately be accepted, even thought it's a bug
  mapper.put("N02", new Integer(0));

  ________________________

  HashMap <String, InfoStore> mapper = new HashMap();
  //you will be able to retrieve an object and then cast it to your InfoStore
  InforStore isN01 = mapper.get("N01"); //no cast
于 2012-08-23T20:59:33.047 回答
0

你在正确的轨道上...

将地图初始化为:

HashMap <String, InfoStor> mapper = new HashMap<String, InfoStor>();

然后在将对象添加到地图后检索它们:

InfoStor var = mapper.get("NS01");
System.out.println(var.getMemory());
于 2012-08-23T21:02:51.427 回答
-1

你可以通过使用数组来做一些事情......例如,如果你可以将对象存储在数组中,然后使用这个想法在哈希映射中实现它......我不知道你是如何设计的,但我曾经陷入困境并像这样完成

例子...

公主班{

int age;

public princess(int age){
    this.age=age;
}
public int getAge(){
    return this.age;
}

}

公共类 hashmaptest {

public static void main(String[] args) {
  princess[] p=new princess[10];
  HashMap scores = new HashMap();
  scores.put("a",new princess(6));
  scores.put("b",new princess(7));

  p[0]=(princess)scores.get("a");
   System.out.println(p[0].getAge());
  p[0]=null;
   p[0]=(princess)scores.get("b");

  System.out.println(p[0].getAge());



}

}

于 2013-10-02T17:11:18.820 回答