如何实例化HashMap <k,v =“”>?

时间:2015-07-22 17:11:10

标签: java generics persistence

首先,我不是泛型的专家,但我尝试创建一个类,使用以下方法将任何类型的对象保存到指定的路径中。

 public class PersistentObject<T> {

  /**
   * Persisted object class.
   */
  private Class<T> clazz;
  /**
   * Persisted object.
   */
  private T object;
  /**
   * Path of the file where the object is persisted
   */
  private String path;

  public PersistentObject(String path, Class<T> clazz) {
    this.clazz = clazz;
    this.path = path;
    load(); //Load from file or instantiate new object
  }
}

它工作正常,但我无法将T用作实现接口Map<K, V>的类,主要是因为clazz构造函数参数。这是我想要实现的目标:

 PersistentObject<String> test =
      new PersistentObject<String>("path", String.class);

 PersistentObject<HashMap<String, Integer>> test2 =
      new PersistentObject<HashMap<String, Integer>>("path", HashMap<String, Integer>.class); // Compilation error

问题是如何传递允许实例化Class的{​​{1}}对象,例如HashMap<K, V>,如果有的话?

我想我的实现存在设计缺陷,对泛型概念有一些误解,或者两者兼而有之。任何意见或建议都非常受欢迎。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您正在使用类文字将Class对象传递到PersistentObject构造函数中。但是,在类文字中不支持泛型,因为Java泛型是一个编译时功能。由于类型擦除,通用类型参数在运行时不可用,可能是在您计划使用此Class对象时。

假设您需要Class对象在运行时实例化HashMap,则类型信息不可用于创建HashMap<String, Integer> - 仅HashMap }。

要使其编译,您可以使用未选中的强制转换。

PersistentObject<HashMap<String, Integer>> test2 =
    new PersistentObject<>("path",
        (Class<HashMap<String, Integer>>) (Class<?>) HashMap.class);

允许从类文字中转换为Class<?>而不会发出警告,但是您会收到有关将其转换为Class<HashMap<String, Integer>>的编译警告。您可以使用@SuppressWarnings("unchecked")删除警告。只要确保这个未经检查的演员阵容确实对你的目的是安全的。

答案 1 :(得分:1)

import java.util.*;

public class PersistentObject<T> {

  /**
   * Persisted object class.
   */
  private Class<T> clazz;
  /**
   * Persisted object.
   */
  private T object;
  /**
   * Path of the file where the object is persisted
   */
  private String path;

  public PersistentObject(String path, Class<T> clazz) {
    this.clazz = clazz;
    this.path = path;
    //load(); //Load from file or instantiate new object
  }

  public static void main(String... args) {
    PersistentObject<String> test =
      new PersistentObject<String>("path", String.class);
    PersistentObject<HashMap<String, Integer>> test2 = new PersistentObject<>("path", (Class<HashMap<String, Integer>>) (Class<?>) HashMap.class);
  }
}