gpt4 book ai didi

java - 泛型是否允许 Java 编译器检查映射中键和值的类型?

转载 作者:行者123 更新时间:2023-11-30 07:38:47 24 4
gpt4 key购买 nike

我处于这样一种情况,我想要一个映射,其中的键是一个接口(interface)类,对应的值是一个实现该接口(interface)的类。换句话说,键和值类型是相关的。

我当前对添加到 map 并获取实现类实例的方法的实现如下所示:

// should be something like Class<T>, Class<? extends T>
static Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>> ();

public static <T> void add(Class<T> interfaceT,
Class<? extends T> implementationT) {

map.put(interfaceT, implementationT);
}

public static <T> T get(Class<T> interfaceT) {
// cast caused by definition not complete.

Class<T> implementationT = (Class<T>) map.get(interfaceT);

// try catch stuff omitted
T t = implementationT.newInstance();
return t;
}

我的问题是:

我可以定义“map”变量以便不需要在 get(...) 方法中强制转换吗?我无法使“新的 HashMap<Class<T>, Class<? extends T>> ()”起作用,所以要么它不可能,要么我错过了一些基本的东西:)

请指教:)


编辑:原来 Class 的 asSubclass() 方法做了我想要的:D

Class<?> rawClassFromMap = map.get(interfaceT);
Class<? extends T> implementationT = rawClassFromMap.asSubclass(interfaceT);

implementationT 的类型为“?extends T”很好,因为我只需要返回一个 T 对象。

我喜欢泛型。让我想起了 Haskell...

最佳答案

看起来目标类似于 Josh Bloch 在 Chapter 5 of Effective Java (item 29). 中描述的“Typesafe 异构容器”。在他的例子中,他将一个类型 ( Class<T> ) 映射到一个(已经实例化的)实例 ( T )。

你可以做类似的事情,使用 asSubclass 而不是 cast :

final class Factory
{

private Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>>();

<T> void map(Class<T> type, Class<? extends T> impl)
{
map.put(type, impl.asSubclass(type));
}

private <T> Class<? extends T> get(Class<T> type)
{
Class<?> impl = map.get(type);
if (impl == null)
throw new IllegalArgumentException("Unknown type: " + type);
return impl.asSubclass(type);
}

<T> T create(Class<T> type)
throws Exception
{
Class<? extends T> impl = get(type);
Constructor<? extends T> ctor = impl.getConstructor();
return ctor.newInstance();
}

}

关于java - 泛型是否允许 Java 编译器检查映射中键和值的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1473444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com