【问题标题】:Comparator of a generic class泛型类的比较器
【发布时间】:2014-05-17 16:42:27
【问题描述】:

我有一个通用类:

class Card<T extends Enum<T> & Rank> implements Comparable<Card<T>>

Rank是java接口。 我正在尝试在 Card 类中创建一个 Comparator 实例。

public final static Comparator<Card> comparator = new Comparator<Card>() { ... }

上一行有一个警告。

卡片是一种原始类型。对泛型类型 Card 的引用应该是 参数化

如何声明Card 类的泛型类型?

【问题讨论】:

  • 我……从这些代码片段中看不到它。您收到此错误的哪一行代码? (我敢打赌你声明了一个 Card 的实例而不给它一个类型。)
  • 您的比较器实现是否要求T 是任何特定类型(或扩展特定类型)?如果没有,您应该只使用Comparator&lt;Card&lt;?&gt;&gt;。另一方面,如果您已经将Card 设为Comparable,为什么还需要比较器?
  • @MattiasBuelens 谢谢,您的回答解决了我的问题。对于同一个类,我需要多个不同的比较器。
  • 在那种情况下,我不会让Card 实现Comparable。如果您忘记在某处使用Comparator,它可能会改用Comparable.compareTo,并导致一些很难找到的错误。如果不实现Comparable,忘记Comparator 将导致编译器错误。 ;-)
  • @MattiasBuelens 感谢您的建议。我将删除 Comparable 接口的实现。

标签: java generics comparator


【解决方案1】:
public class Card<T extends Enum<T> & Rank> {

  private final T rank;
  private final Suit suit;

  public Card(T rank, Suit suit) 
  {
    this.rank = rank;
    this.suit = suit;
  }

  public final static <T extends Enum<T> & Rank> Comparator<Card<T>> byRank() 
  {
    return new Comparator<Card<T>>() {

      @Override
      public int compare(Card<T> o1, Card<T> o2) 
      {
        int r = compareRank(o1, o2);
        return  r != 0 ? r : compareSuit(o1,o2); 
      }
    };
  }

  public final static <T extends Enum<T> & Rank> Comparator<Card<T>> bySuit() 
  {
    return new Comparator<Card<T>>() {

      @Override
      public int compare(Card<T> o1, Card<T> o2) 
      {
        int r = compareSuit(o1,o2); 
        return r != 0 ? r : compareRank(o1, o2);
      }
    };
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2012-11-16
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多