public class arr<T>
{
class comp <T extends Comparable<T>> implements Comparator<T>
{
public int compare(T lObj,T rObj)
{
return lObj.compareTo(rObj);
}
}
ArrayList<T> list;
Comparator<T> comparator;
public arr()
{
list = new ArrayList<T>();
comparator = new comp();
}
public void add(T data)
{
list.add(data);
}
public int getLength()
{
return list.size();
}
public T get(int index)
{
return list.get(index);
}
public void sort()
{
list.sort(comparator);
}
}
您好,我正在尝试使sort函数起作用,但是有问题。 在 arr 构造函数中,如果我写
comparator = new comp<T>();
它给我一个错误的说法
"type argument T#1 is not within bounds of type-variable T#2 comparator =
new comp<T>(); ^
where T#1,T#2 are type-variables:
T#1 extends Object declared in class arr
T#2 extends Comparable<T#2> declared in class arr.comp"
如果我取出字体并这样写
comparator = new comp;
然后它可以工作,但会给我一个警告,提示
warning: [rawtypes] found raw type: arr.comp
comparator = new comp();
我可以看到原始类型的含义。我没有指定类型,但是以某种方式可以正常工作,如果我尝试通过指定类型来修复警告,则会引发错误。你能帮我弄清楚吗?我知道...我是菜鸟,我的代码一定会让您感到痛苦。我正在与通用比较器一起玩,并尝试了许多尝试来熟悉它们。谢谢。
答案 0 :(得分:6)
您的代码使您感到困惑,因为T
定义的comp
隐藏了{em} T
定义的arr
。对于下面的解释,我将它们称为Tcomp
和Tarr
。
Tcomp
是扩展Comparable
所必需的,但Tarr
不是必需的,这意味着Tarr
不能被“映射”到{{1} }。
要解决此问题,请更改Tcomp
,因此还需要扩展Tarr
:
Comparable
附带说明:
您的public class arr<T extends Comparable<T>>
类是一个内部类,但是它不使用外部类中的任何东西,因此它应该是一个静态嵌套类:
comp
或者,将static class comp<T extends Comparable<T>> implements Comparator<T>
保留为内部类,并让其重用外部类的comp
:
T
但是,由于Java(8或更高版本)随附用于比较class arr<T extends Comparable<T>>
{
class comp implements Comparator<T>
对象的Comparator
的实现,因此您应该使用它:
Comparable