Java 将类映射为键,并将对象映射到键类实例
我对Java泛型有一个问题,我甚至不确定是否可能得到我想要的。基本上,标题说明了一切,但让我给你们举个例子。目前我有这样的想法:Java 将类映射为键,并将对象映射到键类实例,java,generics,Java,Generics,我对Java泛型有一个问题,我甚至不确定是否可能得到我想要的。基本上,标题说明了一切,但让我给你们举个例子。目前我有这样的想法: private static Map<Class<? extends Exception>, ExceptionTranslator<?>> MAP; 私有静态映射>映射; 其使用方式如下: MAP.put(SomeException.class, new ExceptionTranslator<SomeException
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。“你做不到”是一个合理的回答,如果你给我机会,我会接受你的回答。好吧,我想我需要做你们在番石榴上做的事: