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

时间:2015-03-28 21:41:55

标签: java compiler-errors

我试图打电话:

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的quickfix功能为我提供的解决方案是将t转换为Object,这对我来说毫无意义。再说一遍,我在几年之后才回到编码中,所以我可能会遗漏一些基本的东西。

我正在使用Java 8和Eclipse Luna。

谢谢!

1 个答案:

答案 0 :(得分:3)

您所做的是宣称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中删除通用类型可以解决您的问题。这引出了一些问题 - 为什么你首先添加它??