Intellij想法java 8 hashmap无法找到合适的方法

时间:2018-01-16 01:54:41

标签: java hashmap

我将数据从//CREATE EVENT gp = 4; gamepad_set_axis_deadzone(gp,0.5) spd = 8; //STEP EVENT x += gamepad_axis_value(gp,gp_axislh) * spd; y += gamepad_axis_value(gp,gp_axislv) * spd; 复制到名为 datamap 的另一个相同类型的hashmap,并发生此错误

HashMap<Class<? extends NXPersistentDataInt>, HashMap<Integer, ? extends NXPersistentDataInt>>

在integerEntry.getValue()

IDE说:

    for (Map.Entry<String, AnalysisTaskDataobj> stringAnalysisTaskDataobjEntry : getTaskDataobjs().entrySet()) {
        HashMap<Class<? extends NXPersistentDataInt>, HashMap<Integer, ? extends NXPersistentDataInt>> hashMap = stringAnalysisTaskDataobjEntry.getValue().getDataMap();
        for (Map.Entry<Class<? extends NXPersistentDataInt>, HashMap<Integer, ? extends NXPersistentDataInt>> classHashMapEntry : hashMap.entrySet()) {
            datamap.putIfAbsent(classHashMapEntry.getKey(), new HashMap<>());
            for (Map.Entry<Integer, ? extends NXPersistentDataInt> integerEntry : classHashMapEntry.getValue().entrySet()) {
                HashMap<Integer, ? extends NXPersistentDataInt> integerHashMap = datamap.get(classHashMapEntry.getKey());
                integerHashMap.put(integerEntry.getKey(), integerEntry.getValue());
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

首先要做的事情。这不是IDE错误......

嗯,你不能这样做。答案就在这里:https://stackoverflow.com/a/2777297/3798111

正如您所看到的,您违反了某些规则,请考虑以下内容:

abstract class Super {
}

class Child1 extends Super {
}

class Child2 extends Super {
}

private static List<? extends Super> myList;

public static void main(String[] args) {
    myList.add(new Child1());
    myList.add(new Child2());
}

我使用了List,但Map确定相同吗?当我们使用捕获时,我们无法知道List本身的正确实现。因此,如果您在Child1内添加一个假设的ArrayList<Child2>实例,并且编译器和IDE可以确保您正确地执行此操作,则会出现错误。

在我发送的链接中有更好的解释。但我会给你一个解决方法,但我真的不鼓励它的使用......那说,抓住它:

static abstract class Super {
    public String saySomething() {
        return "I'm Super";
    }
}

static class Child1 extends Super {
    @Override
    public String saySomething() {
        return "I'm Child1";
    }
}

static class Child2 extends Super {
    @Override
    public String saySomething() {
        return "I like coffee!";
    }
}

private static List<? extends Super> myList;

public static void main(String[] args) {
    myList = new ArrayList<>();
    addSomeData(myList, new Child1());
    addSomeData(myList, new Child2());

    myList.forEach(element -> System.out.println(element.saySomething()));
}

public static void addSomeData(List someList, Object data) {
    someList.add(data);
}

请注意,我没有强制使用param someList类型。

如上所述,JAVA很棘手,所以你可以用它来做很多事情。我不希望你用你的Map来做这件事,但是在现实世界中我们知道......有时候......有一段时间......我们做了一些sh *。所以随意使用(不要说你认识我)