[英]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 Witness : Comparator.<String>comparing().thenComparing()
。
有關詳細信息, 請參閱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.