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;
    }
}