【问题标题】:Java passing Comparator to constructorJava将比较器传递给构造函数
【发布时间】: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&lt;T&gt;,然后只让构造函数接受相同类型的比较器 (public MyClass(Comparator&lt;T&gt; comp))。
  • @Kingamere 您需要在类上声明一个类型变量(例如MyClass&lt;T&gt;),您可以在字段和参数类型声明中使用它(例如Comparator&lt;T&gt;,或者,如果您想成为更通用一点,Comparator&lt;? super T&gt;)。
  • “那么 Java 的 TreeMap 类如何接受任何类型的比较器?” - 它没有。它接受任何特定类型的比较器(取决于&lt;T&gt;)。不是可能是两种 不同 特定类型之一的比较器。 Java 不支持您想要的类型。

标签: java generics constructor comparator


【解决方案1】:

您的要求似乎有点特殊,您不能使用泛型类型,因为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;
    }
}

【讨论】:

  • 那么这究竟是为了什么?
  • @LouisWasserman,类型安全,通常是标记接口完成的工作(另请参见 Effective Java,第 37 条)。如果您在限制条件下提出更好的建议,请随时分享您的答案。
  • 好吧,让构造函数接受一个 ANY 类型的 Comparator 会更容易,而不是仅仅将其限制为 String 和我的“特殊类型”?
  • 否,如果您的代码仅设计用于这两种比较器。
  • @MickMnemonic,嗯?是的,not 更容易限制您接受的类型;那么您不必求助于标记接口,并且 OP 在原始问题中已有的代码是正确的。
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多