[英]Storing abstract and concrete types in Map
I have an interface and class like following: 我有一个类似的接口和类:
public interface Message extends Wrappable
{
}
public class MessageImpl implements Message
{
}
I want to use Java generics to store these Classes into a Map with interface as key and impl as value as: 我想使用Java泛型将这些类存储到Map中,接口作为键,impl作为值:
map.put(Message.class, MessageImpl.class);
I want it to be typesafe, where key must extends Wrappable and value must extend key class. 我希望它是类型安全的,其中键必须扩展Wrappable,值必须扩展键类。 Any help on this? 有什么帮助吗?
A basic Map
can't do this type safely, but you can create a simple wrapper around a Map
to enforce type safety. 基本Map
不能安全地执行此类型,但是您可以围绕Map
创建一个简单的包装器以强制执行类型安全。 That might look something like 可能看起来像
class MyMap {
private final Map<Class<?>, Class<?>> map = new HashMap<>();
public <A extends Wrappable, B extends A> void put(
Class<A> interfaceClass, Class<B> implClass) {
// you can't statically enforce that A is an interface
// and B is a concrete class, though you can do it at runtime
assert interfaceClass.isInterface();
assert !Modifier.isAbstract(implClass.getModifiers());
map.put(interfaceClass, implClass);
}
public <A extends Wrappable> Class<? extends A> get(Class<A> interfaceClass) {
return (Class<? extends A>) map.get(interfaceClass);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.