Java 编译器说方法未定义。。。但它是(我想)
我想打电话:Java 编译器说方法未定义。。。但它是(我想),java,compiler-errors,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.se
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));
}
...
}
但是我有
public class MyClassSelectorObject implements Comparable<MyClassSelectorObject>{
...
public void setCount(Integer value) {
this.count = value;
}
...
}
公共类MyClassSelectorObject实现可比较{
...
公共void setCount(整数值){
this.count=值;
}
...
}
Eclipse的quickfix特性为我提供的解决方案是将t强制转换为一个对象,这对我来说毫无意义。再说一次,几年后我才重新开始编码,所以我可能会错过一些基本的东西
我正在使用Java8和EclipseLuna
谢谢 您所做的是声明一个具有泛型类型参数的:
public class Counter<T> {
}
由于在T
上没有边界,T
相当于对象
正如您已经注意到的,从
计数器中删除泛型类型可以解决您的问题。这就引出了一个问题-为什么要首先添加它…?从计数器类的声明中删除泛型似乎可以解决问题,但我仍然不确定为什么(或者这是否是正确的解决方案)。MyClassSelectorObject
inclass Counter
是名称泛型类型,而不是类的名称。这与在类计数器中使用T
相同。这意味着在add(MyClassSelectorObject t)
MyClassSelectorObject
中也是泛型类型,因此调用t.setCount
是不可能的,因为t
是某个未知泛型类型的实例。@Pshemo您的评论是让我理解以下答案的谜题的一部分。谢谢你的帮助!哇,谢谢你们。我的第一个问题得到了回答@Boris原因是我最初编写的计数器是一个泛型类型,它将计算您参数化它的任何类型的实例。后来,我尝试将它简化为只使用MyClassSelectorObject,但我对泛型有点陌生,对语法感到困惑。
public class Counter<T> {
}
public void add(T t) {
counts.merge(t, 1, Integer::sum);
t.setCount(counts.get(t));
}