编译器说方法未定义......但它是(我认为)

compiler says method is undefined ... but it is (I thought)

我正在尝试呼叫:

public class Counter<MyClassSelectorObject> {

    final HashMap<MyClassSelectorObject, Integer> counts = new HashMap<>();

    public void add(MyClassSelectorObject t) {
        counts.merge(t, 1, Integer::sum);
        t.setCount(counts.get(t));
    }
...
}

但是,我在 t.setCount(counts.get(t)); 上的 Eclipse 编译器中收到以下错误:

The method setCount(Integer) is undefined for the type MyClassSelectorObject

不过我有

public class MyClassSelectorObject implements Comparable<MyClassSelectorObject>{

    ...

    public void setCount(Integer value) {
        this.count = value;
    }

    ...

}

Eclipse 的快速修复功能为我提供的解决方案是将 t 转换为对象,这对我来说毫无意义。再一次,我在离开多年后才重新开始编码,所以我可能会遗漏一些基本的东西。

我正在使用 Java 8 和 Eclipse Luna。

谢谢!

您所做的是声明一个具有通用类型参数的 generic class

public class Counter<T> {

}

除了你的 T 被称为 MyClassSelectorObject...

所以你已经用泛型类型参数隐藏了你的 class,你的方法等同于:

public void add(T t) {
    counts.merge(t, 1, Integer::sum);
    t.setCount(counts.get(t));
}

由于 T 没有界限,T 等同于 Object

正如您已经注意到的,从 Counter 中删除通用类型可以解决您的问题。这引出了问题 - 你为什么首先添加它......?