Java将比较器传递给构造函数
如果我想向构造函数传递一个可以比较两种不同类型的比较器,那么构造函数的参数应该是这样的吗Java将比较器传递给构造函数,java,generics,constructor,comparator,Java,Generics,Constructor,Comparator,如果我想向构造函数传递一个可以比较两种不同类型的比较器,那么构造函数的参数应该是这样的吗 public MyClass(Comparator<?> comp) { this.comp = comp; } 这样做正确吗 谢谢 编辑: 以下是相关代码: public class BST<T> { /* binary search tree */ ... private Comparator<T> c; /* pass in comparat
public MyClass(Comparator<?> comp) {
this.comp = comp;
}
这样做正确吗
谢谢
编辑:
以下是相关代码:
public class BST<T> {
/* binary search tree */
...
private Comparator<T> c;
/* pass in comparator to constructor*/
public BST(Comparator<T> c) {
this.c = c;
}
您的需求似乎有点特殊,您不能使用泛型类型,因为
String
是最后一个类,您的“特殊类”无法扩展
您可以通过使用标记接口来实现这一点,您的Comparator
类都需要实现:
/** Marker interface for special comparators */
public interface SpecialComparator{}
public class NameComparator implements Comparator<String>, SpecialComparator{
@Override
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
}
public class BST {
/* binary search tree */
...
private SpecialComparator c;
/* pass in comparator to constructor*/
public BST(SpecialComparator c) {
this.c = c;
}
}
/**专用比较器的标记接口*/
公共接口专用比较程序{}
公共类NameComparator实现Comparator、SpecialComparator{
@凌驾
公共整数比较(字符串s1、字符串s2){
返回s2.比较到(s1);
}
}
公共类BST{
/*二叉搜索树*/
...
私人特别比较员c;
/*将比较器传递给构造函数*/
公共BST(特殊比较员c){
这个.c=c;
}
}
您不能在this.comp
上调用compare
方法,因为它是通配符类型。我稍后会添加更多内容,但这不是问题的重点。我真的很想知道如何处理构造函数的泛型类型。您可以使类本身泛型:MyClass
,然后只让构造函数接受相同类型的比较器(public MyClass(Comparator comp)
)。@Kingamere您需要在类上声明一个类型变量(例如MyClass
),您在字段和参数类型声明中使用的(例如,Comparator
或者,如果您想更通用一点,Comparator“那么Java的TreeMap类如何接受任何类型的比较器?”-它不接受。它接受任何特定类型的比较器(取决于
)。不是可以是两种不同特定类型之一的比较器。Java不支持您想要的类型。那么,这实际上实现了什么?@LouisWasserman,type safety,这通常是标记接口实现的功能(另请参见有效Java,第37项)。如果您在限制条件下提出了更好的建议,请随意分享您的答案。好的,让构造函数接受任何类型的比较器,而不是仅将其限制为String
和我的“特殊类型”会更容易吗?不,如果您的代码只设计用于这两种类型的比较器。@Mick助记符,嗯?是的,不限制您接受哪种类型比较容易;那么您不必求助于标记接口,OP在原始问题中已有的代码是正确的。
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 = new BST(new NameComparator());
/** Marker interface for special comparators */
public interface SpecialComparator{}
public class NameComparator implements Comparator<String>, SpecialComparator{
@Override
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
}
public class BST {
/* binary search tree */
...
private SpecialComparator c;
/* pass in comparator to constructor*/
public BST(SpecialComparator c) {
this.c = c;
}
}