Java Can';t找出哈希映射的正确类型

Java Can';t找出哈希映射的正确类型,java,Java,现在我想使用这个构造typesave,我得到了: filter.put("a", EnumA.class);I got following setup: public interface InterfaceA { abstract public Object[] foo(); } public enum EnumA implements InterfaceA { RED(); ... } public enum EnumB implements InterfaceA { O

现在我想使用这个构造typesave,我得到了:

filter.put("a", EnumA.class);I got following setup:

public interface InterfaceA {
  abstract public Object[] foo();
}

public enum EnumA implements InterfaceA {
  RED();
  ...
}

public enum EnumB implements InterfaceA {
  OAK();
  ...
}
private void importSettingViaEnum(类clazz){。。。
对于(T元素:clazz.getEnumConstants()){
…=f(元素序数());
…=元素foo();
...
}
}
这似乎是正确的,clazz应该只适用于上面的枚举。但是现在,我想不出这张地图的正确类型,这不起作用:

private <T extends Enum<T> & InterfaceA> void  importSettingViaEnum(Class<T> clazz) { ...
    for (T elem : clazz.getEnumConstants()){
        ... = f(elem.ordinal());
        ... = elem.foo();
        ...
    }
}
public Main(){
Map filter=newhashmap();
filter.put(“a”,EnumA.class);
filter.put(“b”,EnumB.class);
importSettingViaEnum(filter.get(“a”));
}

有人有线索吗?我希望这东西是安全的

下面是一些粘贴箱:


编辑1:

尝试过这样的东西,但不起作用

public <T extends Enum<T> & InterfaceA> Main() {
    Map<String, Class<T>> filter = new HashMap<>();
    filter.put("a", EnumA.class);
    filter.put("b", EnumB.class);
    importSettingViaEnum(filter.get("a"));
}
public Main(){

Map如果您希望创建一个类的sting映射,这应该适用于您:

public Main() {
        Map<String, Class<? extends Enum<? extends InterfaceA>>> filter = new HashMap<>();
        filter.put("a", EnumA.class);
        filter.put("b", EnumB.class);
        importSettingViaEnum(filter.get("a")); // BREAK THE BUILD
    }
Map filter=new HashMap();//映射中字符串对应的任何类
filter.put(“a”,EnumA.class);

类型擦除…提供泛型类型参数的类型对象

Map<String, Class> filter = new HashMap<>(); // any Class put against a string in the map
filter.put("a", EnumA.class);
public void main(类类型){
Map filter=newhashmap();
过滤器。放置(“a”,类型);
//importSettingViaEnum(filter.get(“a”));
}
主(枚举类);
这还解耦了实现类型(EnumA)


或者选择部分类型安全

public <T extends Enum<T> & InterfaceA> void main(Class<T> type) {
    Map<String, Class<T>> filter = new HashMap<>();
    filter.put("a", type);
    //importSettingViaEnum(filter.get("a"));
}

    main(EnumA.class);
public void main2(){

映射“我希望这个东西是类型安全的。”你可以用这段代码添加任何类。提供泛型类型参数的类型对象。+1这是否解决了我的问题?在我看来,这只是将问题提高了一个级别。如果我有“filter.put(“b”,EnumB.class);“additionaly”怎么办?我必须调用main(class clazz)对于每个枚举。@Dennisochoki您对移位的看法是正确的,因此选择部分类型安全性,扩展答案。@Dennisochoki在某种程度上您仍然需要定义类型。@nullpointer说它是一个类,它是一个实现InterfaceA的枚举,这还不够吗?如果我可以编写类,为什么我不能用我的限制指定它[课堂
public void main2() {
    Map<String, Class<? extends InterfaceA>> filter = new HashMap<>();
    filter.put("a", EnumA.class);
    Class<? extends InterfaceA> type = filter.get("a");
    if (type.isEnum()) {
        ....
    }
}