Java 如何使用类类型作为映射键,使用类的值列表作为映射值?

Java 如何使用类类型作为映射键,使用类的值列表作为映射值?,java,hibernate,dictionary,Java,Hibernate,Dictionary,我很难创建CodeService接口的实现类 public interface CodeService<T extends AbstractCode> { Map<Class<T>, List<T>> getCodes(); } 但是,IDE在map.put(type,list)行上发出一个错误 Map中的put(java.lang.Class,java.util.List)不能应用于(java.lang.Class,java.util.

我很难创建CodeService接口的实现类

public interface CodeService<T extends AbstractCode> {
    Map<Class<T>, List<T>> getCodes();
}
但是,IDE在
map.put(type,list)
行上发出一个错误

Map中的put(java.lang.Class,java.util.List)不能应用于(java.lang.Class,java.util.List)


我的问题是,如何在我的映射中将类类型存储为键,以便获取该类所有值的列表?

如果我要实例化
HibernateCodeService
的一个实例,那么通过您的参数,您的映射将是
map
。由于
国家
性别
不相关,这意味着不允许将其插入地图

现在,对于您试图实现的目标,您使用泛型是行不通的。因为映射的键是
,这意味着映射每个实例只能包含一个可能的值,这在某种程度上违背了映射的目的。虽然我同意@chrylis的观点,即在生产系统中这样做不是一件好事,但您可以通过从接口中删除泛型来完成您想要完成的任务,并让您的方法返回:

public interface CodeService {
    Map<Class<? extends AbstractCode>, List<? extends AbstractCode>> getCodes();
}
公共接口代码服务{

这是一个关于泛型的有趣练习,但至少作为一个实际的实践是非常值得怀疑的。谢谢你的回答,这是我必须创建的一个实践项目,因此除了更好地了解泛型之外,它没有任何用处。:)另外,你能解释一下为什么这对于现实项目来说不是一个好的实践吗对于现实系统来说,这有两个原因不好。首先,从接口名称看,不清楚特定实现支持哪些类类型,哪些不支持。在
AbstractCode
下创建新的子类将变得非常混乱,非常快。其次,任何涉及到强制转换的内容(必须由该方法的用户完成)通常是一个危险的举动。理想情况下,您的接口应该为其支持的每个返回类型提供一个方法。第二点,实现此接口的正确方法是为每个类提供一个扩展抽象代码的方法,并返回该特定类的值列表?将“实现”替换为“设计”,你说得对。
public interface CodeService {
    Map<Class<? extends AbstractCode>, List<? extends AbstractCode>> getCodes();
}