Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按类类型创建泛型类型安全哈希映射?_Java_Generics - Fatal编程技术网

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