【发布时间】:2016-06-10 21:27:30
【问题描述】:
如果我想给构造函数传递一个可以比较两种不同类型的Comparator,构造函数的参数应该是这样的吗?:
public MyClass(Comparator<?> comp) {
this.comp = comp;
}
然后是我的比较器类:
public NameComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
}
然后每当我实例化我的类时:
MyClass myClass = new MyClass(new NameComparator());
这是正确的做法吗?
谢谢
编辑:
以下是相关代码:
public class BST<T> {
/* binary search tree */
...
private Comparator<T> c;
/* pass in comparator to constructor*/
public BST(Comparator<T> c) {
this.c = c;
}
比较器:
public class NameComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
}
当我创建 BST 时:
BST bst = new BST(new NameComparator());
【问题讨论】:
-
您不应该在
this.comp上调用compare方法,因为它是通配符类型。 -
我稍后会添加更多内容,但这不是这个问题的重点。我真的很想知道如何处理构造函数的泛型类型
-
您可以将类本身设为泛型:
MyClass<T>,然后只让构造函数接受相同类型的比较器 (public MyClass(Comparator<T> comp))。 -
@Kingamere 您需要在类上声明一个类型变量(例如
MyClass<T>),您可以在字段和参数类型声明中使用它(例如Comparator<T>,或者,如果您想成为更通用一点,Comparator<? super T>)。 -
“那么 Java 的 TreeMap 类如何接受任何类型的比较器?” - 它没有。它接受任何特定类型的比较器(取决于
<T>)。不是可能是两种 不同 特定类型之一的比较器。 Java 不支持您想要的类型。
标签: java generics constructor comparator