如何实例化一个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);
}
}
首先,我不是泛型专家,但我尝试创建一个 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);
}
}