【问题标题】:Using reference variable to point to a Comparator?使用引用变量指向比较器?
【发布时间】:2015-12-31 23:11:10
【问题描述】:

我在做练习时遇到了一种创建Comparator 的新方法。谁能稍微解释一下?

class Checker{    
    public Comparator<Player> desc = new Comparator<Player>() {
        public int compare(Player A, Player B){
            if(A.score < B.score){
                return 1;
            }
            else if(A.score == B.score){
                return B.name.compareTo(A.name);
            }
            else{
                return -1;
            }
        }
    };
}

过去,我只看到有人这样做:

class Checker implements Comparator{
    @Override
    public int compare(Player A, Player B){
        ..........
        ..........
    }
}

所以第一个例子对我来说真的很新颖(因为我是初学者?)。这确实有意义:desc 可以是类Checker 的属性/实例变量,它指向Comparator 类/接口的新实例。然而这两种不同的做事方式背后是否还有更多故事?它们都需要创建一个不同的类,所以我看不出如何更有条理。

【问题讨论】:

  • 你确定你看到的是implements Comparator&lt;T&gt;而不是implements Comparator(没有&lt;T&gt;)? compare(Object o1, Object o2) 在泛型时代之前(Java 5 之前)会很好,我们无法指定精确比较应该期望的类型。
  • @Pshemo 抱歉,我做了更改!但我确实想知道,为什么我们在为新类实现它时不需要一个 来指定类型?
  • @Pshemo 那么第一种创建比较器的方法也很常见吗?当我搜索“Comparator Java”时,我以前从未在许多网站上看到过它
  • @whales 通常你会看到一个名为 CheckerComparator 的类,它实现了 Comparator&lt;Checker&gt;,而不是像上面所示的那样被嵌入。
  • 我想知道到底是什么让你感到困惑。你问的是Comparator 还是Comparator&lt;Person&gt;?还是您对实现可比较的匿名类和标准类更感兴趣?

标签: java comparator comparable


【解决方案1】:

两种语法都绝对正确。在第一种情况下,您只是使用匿名类的概念。在第二个中,您创建了一个类 Checker,它实现比较方法。

作为初学者,理解第二种语法要容易得多,除了两者之间没有区别。

你可以在这里学习更多关于匿名类的信息-

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

如果您想在更多地方使用比较器,最好在单独的类中使用解决方案而不是匿名类。匿名 vs 类解决方案类似于内联 css 样式 vs 样式类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2012-03-28
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多