如何实例化一个HashMap<K, V>?

How to instantiate a HashMap<K, V>?

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

 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> 的 class,主要是因为 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

问题是我如何传递允许 HashMap<K, V> 实例化的 Class 对象,例如HashMap<String, Integer>,有没有?

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

提前致谢。

您正在使用 class 文字将 Class 对象传递给 PersistentObject 构造函数。但是,class 字面值不支持泛型,因为在 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<?> 而不会出现警告,但您会收到有关将其转换为 Class<HashMap<String, Integer>> 的编译警告。您可以使用 @SuppressWarnings("unchecked") 删除警告。请确保这个未经检查的转换对于您的目的来说确实是安全的。

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);
  }
}