gpt4 book ai didi

java - 以类作为键和值进行映射,对象在键类实例上运行

转载 作者:行者123 更新时间:2023-11-30 09:19:02 24 4
gpt4 key购买 nike

我对 Java 泛型有疑问,我不确定是否有可能得到我想要的。基本上标题说明了一切,但让我举个例子。目前我有这样的东西:

private static Map<Class<? extends Exception>, ExceptionTranslator<?>> MAP;

它的使用方式如下:

MAP.put(SomeException.class, new ExceptionTranslator<SomeException>());

但我想强制执行作为键传递的异常类型的翻译器,类似于您在方法上所做的事情:

<T extends Exception> Map<Class<T>, ExceptionTranslator<T>> MAP;

这当然不是正确的代码,我想我的 generics-foo 还不够强大。在 Java 中甚至可能吗?

最佳答案

我只是想解释一下为什么这是不可能的。

问题是无法保证类型安全。 Map依赖于equals/hashMap,编译器无法证明这些方法与T类型相关的正确性。

想象一下,如果您使用自己的泛型类而不是 Class,它将为其所有实例返回 equals==true。在这种情况下,您可以将一种类型放入映射中,但用另一种类型提取,这将产生转换异常:

private<E extends Number> void mp()
{
Map<Key<E>, E> map = new HashMap<>();
map.put(new Key<Integer>(), 42);// Yes, there is compilation error!
// Otherwise we could do this:
String str = map.get(new Key<String>());// cast exception!
}

class Key<T>
{
@Override
public int hashCode()
{
return 0;
}

@Override
public boolean equals(final Object obj)
{
return obj instanceof Key;
}
}

关于java - 以类作为键和值进行映射,对象在键类实例上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156529/

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