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").            
    }            
}

InfoStor.class

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(リスト クラスではないため、キャストする必要も、クラス キャスト例外について心配する必要もありません)。

そう:

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 に追加されたジェネリックを利用します。これらは、コンパイル時の型チェックに役立ち、キャストを不要にします。

  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 に答える