【问题标题】:What is the right signature of constant comparator or method for subclasses?子类的常量比较器或方法的正确签名是什么?
【发布时间】:2021-11-04 02:05:21
【问题描述】:

我有一个像这样的抽象类。

abstract class Some {

    int rank;
}

现在我想定义一个静态变量和/或比较rank的方法。

static <T extends Some> Compartor<T> comparingRank() {
    return Comparator.compartingInt(Some::getRank);
}
static final Compartor<Some> COMPARING_RANK
        = Compartor.comparingInt(Some::getRank);

我的问题是……

  • 我应该将&lt;? super T&gt; 用于comparingRank() 方法吗?
  • 我应该将&lt;? super T&gt; 用于COMPARING_RANK 字段吗?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    我们通常不鼓励在方法的返回类型中使用通配符,因为这会导致方法不可用。因此,第一个选项因此被排除在外。

    使用下界通配符? super T 的第二种变体通常是一件好事,它使您的 API 更加灵活。但是,在这种特殊情况下,comparingInt 声明了该通配符,而您的通配符是多余的。

    static &lt;T&gt; Comparator&lt;T&gt; comparingInt(ToIntFunction&lt;? super T&gt; keyExtractor)

    因此,在我看来,您可以保持原样而无需任何修改。但是,如果情况允许,您仍然可以使用通配符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2019-02-12
      • 2013-04-25
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多