簡體   English   中英

限制方法引用參數類型

[英]Restrict method reference parameter type

Set<String> premiumStrings = new HashSet<>();
Set<String> sortedSet = new TreeSet<>(Comparator.comparing(premiumStrings::contains).thenComparing(Comparator.naturalOrder()));

這不起作用,因為premiumStrings::contains可以接受任何對象而不僅僅是字符串。 可以將其替換為(String s) -> premiumStrings.contains(s) ,但是有沒有辦法在仍然使用方法引用 lambda 的同時限制參數類型?

(具體來說,問題是The method thenComparing(Comparator<? super Object>) in the type Comparator<Object> is not applicable for the arguments (Comparator<Comparable<? super Comparable<? super T>>>) 。)

幫助編譯器使用類型:

Set<String> sortedSet = new TreeSet<>(
                Comparator.<String, Boolean>comparing(premiumStrings::contains).thenComparing(Comparator.naturalOrder()));

編譯器應該推斷傳遞給每個方法的參數類型。

當我們有一個方法鏈時,上下文並沒有為此提供足夠的信息。 並且每個方法引用(或 lambda 表達式)的參數都將被視為Object而不是String類型。

為避免這種情況,我們可以顯式提供類型作為 lambda 表達式的參數:

Set<String> premiumStrings = new HashSet<>();
    
Comparator<String> comparator = 
    Comparator.comparing((String str) -> premiumStrings.contains(str))
        .thenComparing(Comparator.naturalOrder());
        
Set<String> sortedSet = new TreeSet<>(comparator);

或者通過使用所謂的Type WitnessComparator.<String>comparing().thenComparing()

有關詳細信息, 請參閱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM