1

Genericsがどのように機能するかを理解しようとしています。このコードを使用して、これらの種類のパラメーターMapを使用してクラスのnewDetailsのエントリを表示します。これは私のコードです。

public class Map<Key,Value> {

    private Map<Key, Value> entry;

    public Map(){
        entry = new HashMap<Key,Value>();
    }

    public void putEntry(Key k, Value id){
        entry.put(k, id);
    }

    public void printMe(){
        System.out.println();
        for (Map.Entry<Key, Value> x: entry.entrySet()){
            System.out.print(x+" ");
        }
    }
}

チョコレートクラス

    public class Chocolates<T> {

    private List<T> listOfChocolate = new ArrayList<T>(); 

    public Chocolates(T choc){
        listOfChocolate.add(choc);
    }

    public void addChocolate(T getChoc){
        listOfChocolate.add(getChoc);
    }

    public List<T> getLists(){
        return listOfChocolate;
    }
}

主な方法

public static void main(String[] arg){

        Map<Chocolates<String>, Integer> newDetails = new Map<Chocolates<String>, Integer>();
        Chocolates<String> choco = new Chocolates<String>();

        newDetails.putEntry((new Chocolates<String>("Cadbury")), 1);
        newDetails.putEntry((new Chocolates<String>("Hersheys")), 2);
        newDetails.printMe();
    }

プログラムを実行しようとすると、これが表示されます

generics.Chocolates@9931f5=1 generics.Chocolates@19ee1ac=2 

Cadbury 1、Hersheys 2などの実際のエントリを表示するにはどうすればよいですか?


また、新しいエントリを追加するたびに常に新しいオブジェクトを作成するため、メインメソッドまたはプログラムの一部を改善する方法はありますか。もともと私がやりたかったのは、このコードのジェネリックバージョンを作成することです。

Map<List<String>, Integer> newDetails = new HashMap<List<String>, Integer>();

誰かが私に言ったように、ジェネリックスクラスにそのコード行を実装する方がはるかに良いです。助言がありますか?ありがとう

編集2

Nambariの要求に応じて、MapsClassprintMeメソッドを編集しました

public void printMe(){
        System.out.println();
        for (Map.Entry<Key, Value> x: entry.entrySet()){
            System.out.print(x.getKey()+" "+x.getValue());
        }
    }

出力は次のとおりです。

generics.Chocolates@9931f5 1generics.Chocolates@19ee1ac 2

しかし、Joaoが提案したようにこの行を追加すると

public String toString(){
        return listOfChocolate.toString();
    }

出力は:

[Hersheys] 2[Cadbury] 1

皆さんの助けに感謝します!

4

2 に答える 2

3

クラスでオーバーライドObject#toStringします。Chocolate

public class Chocolates<T> {

  // ...

  @Override
  public String toString() {
    return listOfChocolate.toString();
  }
}
于 2012-09-25T18:48:38.023 に答える
2

更新printMe(..)方法System.out

System.out.print(x.getKey() + " " + x.getValue());

編集:

 public void printMe(){
        System.out.println();
        for (java.util.Map.Entry<Key, Value> x: entry.entrySet()){
            System.out.print(((Chocolates)x.getKey()).getLists().get(0) +" "+x.getValue());
        }
    }

注: null のNPE場合、このコードはスローする可能性がありますgetLists()

于 2012-09-25T18:47:48.750 に答える