Java 将类映射为键,并将对象映射到键类实例

Java 将类映射为键,并将对象映射到键类实例,java,generics,Java,Generics,我对Java泛型有一个问题,我甚至不确定是否可能得到我想要的。基本上,标题说明了一切,但让我给你们举个例子。目前我有这样的想法: private static Map<Class<? extends Exception>, ExceptionTranslator<?>> MAP; 私有静态映射>映射; 其使用方式如下: MAP.put(SomeException.class, new ExceptionTranslator<SomeException

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

private static Map<Class<? extends Exception>, ExceptionTranslator<?>> MAP;
私有静态映射>映射;
其使用方式如下:

MAP.put(SomeException.class, new ExceptionTranslator<SomeException>());
MAP.put(SomeException.class,newexceptionTranslator());
但我想强制执行作为键传递的异常类型的转换器,类似于对方法执行的操作:

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

这当然不是一个正确的代码,我想我的泛型foo不够强大。甚至在Java中也有可能吗?

仅使用法线贴图无法做到这一点;您必须使用强制类型约束的方法进行自己的包装。请看相关问题。

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

问题是不可能保证类型安全。映射依赖于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;
    }
}
private void mp()
{
Map Map=newhashmap();
map.put(new Key(),42);//是的,有编译错误!
//否则我们可以这样做:
String str=map.get(new Key());//强制转换异常!
}
类密钥
{
@凌驾
公共int hashCode()
{
返回0;
}
@凌驾
公共布尔等于(最终对象obj)
{
返回键的obj实例;
}
}

为什么您的类在其定义中没有
泛型?您不能仅使用普通的
映射来实现这一点;您必须使用强制类型约束的方法来完成自己的包装。谢谢,@Louis。“你做不到”是一个合理的回答,如果你给我机会,我会接受你的回答。好吧,我想我需要做你们在番石榴上做的事: