Java 通用比较器
Java Generic Comparator
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);
}
}
您好,我正在尝试使排序功能正常工作,但遇到了问题。
在 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();
我明白原始类型的含义了。我没有指定类型,但它以某种方式起作用,如果我尝试通过指定类型来修复警告,它会抛出错误。你能帮我弄清楚吗?我知道……我是菜鸟,我的代码一定让你眼花缭乱。我正在玩通用比较器并尝试很多事情来熟悉。谢谢。
您的代码让您感到困惑,因为 comp
定义的 T
是 隐藏 arr
定义的 T
.对于下面的解释,我将它们称为 Tcomp
和 Tarr
.
Tcomp
需要扩展 Comparable
,但 Tarr
不需要这样做,这意味着 Tarr
不能 "mapped" Tcomp
.
要修复,更改 Tarr
因此还需要扩展 Comparable
:
public class arr<T extends Comparable<T>>
旁注:
你comp
class是一个内部class,但是它没有使用外部class的任何东西,所以它应该是一个静态嵌套class:
static class comp<T extends Comparable<T>> implements Comparator<T>
或者,将 comp
保留为内部 class,并让它重复使用外部 class:
中的 T
class arr<T extends Comparable<T>>
{
class comp implements Comparator<T>
但是,由于 Java(8 或更高版本)带有用于比较 Comparable
对象的 Comparator
实现,您应该使用它:
public class arr<T extends Comparable<T>>
{
ArrayList<T> list;
Comparator<T> comparator;
public arr()
{
list = new ArrayList<T>();
comparator = Comparator.naturalOrder();
}
// rest of code
}
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);
}
}
您好,我正在尝试使排序功能正常工作,但遇到了问题。 在 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();
我明白原始类型的含义了。我没有指定类型,但它以某种方式起作用,如果我尝试通过指定类型来修复警告,它会抛出错误。你能帮我弄清楚吗?我知道……我是菜鸟,我的代码一定让你眼花缭乱。我正在玩通用比较器并尝试很多事情来熟悉。谢谢。
您的代码让您感到困惑,因为 comp
定义的 T
是 隐藏 arr
定义的 T
.对于下面的解释,我将它们称为 Tcomp
和 Tarr
.
Tcomp
需要扩展 Comparable
,但 Tarr
不需要这样做,这意味着 Tarr
不能 "mapped" Tcomp
.
要修复,更改 Tarr
因此还需要扩展 Comparable
:
public class arr<T extends Comparable<T>>
旁注:
你comp
class是一个内部class,但是它没有使用外部class的任何东西,所以它应该是一个静态嵌套class:
static class comp<T extends Comparable<T>> implements Comparator<T>
或者,将 comp
保留为内部 class,并让它重复使用外部 class:
T
class arr<T extends Comparable<T>>
{
class comp implements Comparator<T>
但是,由于 Java(8 或更高版本)带有用于比较 Comparable
对象的 Comparator
实现,您应该使用它:
public class arr<T extends Comparable<T>>
{
ArrayList<T> list;
Comparator<T> comparator;
public arr()
{
list = new ArrayList<T>();
comparator = Comparator.naturalOrder();
}
// rest of code
}