首先,我不是泛型的专家,但我尝试创建一个类,使用以下方法将任何类型的对象保存到指定的路径中。
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>
,如果有的话?
我想我的实现存在设计缺陷,对泛型概念有一些误解,或者两者兼而有之。任何意见或建议都非常受欢迎。
提前致谢。
答案 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);
}
}