Comparator.reversed()編譯類型推斷失敗


錯誤描述

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Client {

  public static void main(String[] args) {
    List<String> list = Arrays.asList("hello", "world", "hello cat");
    //works
    list.sort(Comparator.comparingInt(String::length));
    //works
    list.sort(Comparator.comparingInt(x -> x.length()));
    //works
    list.sort(Comparator.comparingInt((String x) -> x.length()).reversed());
    //not works
    list.sort(Comparator.comparingInt(x -> x.length()).reversed());
    System.out.println(list);
  }

}

/**
     * Returns a comparator that imposes the reverse ordering of this
     * comparator.
     *
     * @return a comparator that imposes the reverse ordering of this
     *         comparator.
     * @since 1.8
     */
    default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
    }

前面幾種情況可以正常編譯,第四種情況編譯不通過,這種情況編譯器不能推斷出字符串類型,只能當做Object類型。

解決方法

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Client {

  public static void main(String[] args) {
    List<String> list = Arrays.asList("hello", "world", "hello cat");
    //works
    list.sort(Comparator.comparingInt((String x) -> x.length()).reversed());
    //works
    list.sort(Collections.reverseOrder(Comparator.comparingInt(x -> x.length())));
    //works
    list.sort(Comparator.comparing(x -> x.length(), Comparator.reverseOrder()));
    System.out.println(list);
  }

}

顯式聲明類型或者使用Collections.reverseOrder()方法。

參考

Comparator.reversed() does not compile using lambda
Comparator.reversed() should be usable in static context


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM