Java 如何按类类型创建泛型类型安全哈希映射?
我想创建一个Java 如何按类类型创建泛型类型安全哈希映射?,java,generics,Java,Generics,我想创建一个HashMap,将特定的类类型映射到一个特定的新对象 稍后我想传递类类型并获取对该特定对象的引用。 简单的例子: Map<Class<?>, ?> values = new HashMap<>(); public <T> t get(Class<T> type) { return values.get(type); } //pet and car do not share any interface or pa
HashMap
,将特定的类类型映射到一个特定的新对象
稍后我想传递类类型并获取对该特定对象的引用。
简单的例子:
Map<Class<?>, ?> values = new HashMap<>();
public <T> t get(Class<T> type) {
return values.get(type);
}
//pet and car do not share any interface or parent class
class Pet;
class Car;
//error: not applicable for arguments
values.put(Pet.class, new Pet());
values.put(Car.class, new Car());
如何相应地创建这样一个通用hashmap和lookup函数?您可以使用
Object
作为值类型:
Map<Class<?>, Object> values = new HashMap<>();
我想你在寻找一个异构容器。如果没有任何显式强制转换,在Java中创建这样一个容器是不容易的 我认为最简单的方法是把你的地图放在课堂上-
public class Container {
private Map<Class<?>, Object> values = new HashMap<>();
public <T> T put(Class<T> klass, T obj) {
return klass.cast(values.put(klass, obj));
}
public <T> T get(Class<T> klass) {
return klass.cast(values.get(klass));
}
}
如果您希望能够将其他任何对象作为object
放置在地图中,则需要存储某种类型的对象,因此请从以下内容开始:
Map<Class<?>, Object> values = new HashMap<>();
现在的诀窍是获取对象,我们按如下方式执行:
@SuppressWarnings("unchecked")
private <T> T get(Class<T> clazz) {
return (T)values.get(clazz);
}
将打印:
get(Pet.class).getClass() = class testproject8.Pet
get(Car.class).getClass() = class testproject8.Car
你在找番石榴吗?太好了,也许这就是我想要重新创造的;)
Map<Class<?>, Object> values = new HashMap<>();
Map<Class<?>, Object> values = new HashMap<>();
values.put(Pet.class, new Pet());
values.put(Car.class, new Car());
@SuppressWarnings("unchecked")
private <T> T get(Class<T> clazz) {
return (T)values.get(clazz);
}
values = new HashMap<>();
values.put(Pet.class, new Pet());
values.put(Car.class, new Car());
System.out.println("get(Pet.class).getClass() = " + get(Pet.class).getClass());
System.out.println("get(Car.class).getClass() = " + get(Car.class).getClass());
get(Pet.class).getClass() = class testproject8.Pet
get(Car.class).getClass() = class testproject8.Car