gpt4 book ai didi

Java var 和推理类型歧义

转载 作者:行者123 更新时间:2023-12-04 11:11:46 25 4
gpt4 key购买 nike

两个调用都是正确的:

Collectors.groupingBy((String s)->s.toLowerCase(),Collectors.counting());
Collectors.groupingBy((String s)->s.toLowerCase(Locale.ENGLISH),Collectors.counting());
从那以后,为什么下面一个是错误的:
Collectors.groupingBy(String::toLowerCase,Collectors.counting());
毕竟 String::toLowerCase不能对应第二个...那IntelliJ为什么说 Reference to 'toLowerCase' is ambiguous, both 'toLowerCase(Locale)' and 'toLowerCase()' match ? String::toLowerCase必须明确解析为 (String s)->s.toLowerCase()还是我错过了什么?
当然,如果我为 IntelliJ 添加更多上下文,例如:
Collector<String,?,Map<String,Long>> c = Collectors.groupingBy(String::toLowerCase,Collectors.counting());
这是正确的,但是在 Java 10 var 推理类型上下文中它是错误的:
var c = Collectors.groupingBy(String::toLowerCase,Collectors.counting());
我知道编译器无法推断 counting 的输入类型.如果我写:
Collector<String,?,Long> counter = Collectors.counting();
var c = Collectors.groupingBy(String::toLowerCase,counter);
它是正确的。因此,为什么编译器不能推断出唯一可接受的形式?
- - - -编辑 - - - -
我交替使用 IntelliJ/编译器只是因为我首先使用 IntelliJ 并且报告的错误是:
Reference to 'toLowerCase' is ambiguous, both 'toLowerCase(Locale)' and 'toLowerCase()' match
编译器的错误更难以理解(但包含更多关于推理失败原因的提示),例如:
Demo.java:31: error: incompatible types: cannot infer type-variable(s) T#1,K,A,D,CAP#1,T#2
Collectors.groupingBy(String::toLowerCase,Collectors.counting());
^
(argument mismatch; invalid method reference
incompatible types: Object cannot be converted to Locale)
where T#1,K,A,D,T#2 are type-variables:
T#1 extends Object declared in method <T#1,K,A,D>groupingBy(Function<? super T#1,? extends K>,Collector<? super T#1,A,D>)
K extends Object declared in method <T#1,K,A,D>groupingBy(Function<? super T#1,? extends K>,Collector<? super T#1,A,D>)
A extends Object declared in method <T#1,K,A,D>groupingBy(Function<? super T#1,? extends K>,Collector<? super T#1,A,D>)
D extends Object declared in method <T#1,K,A,D>groupingBy(Function<? super T#1,? extends K>,Collector<? super T#1,A,D>)
T#2 extends Object declared in method <T#2>counting()
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ?

最佳答案

这是编译器的“弱点”,至少直到 this JEP is in place .
我已经回答了几乎完全相同的问题 here .还有一个answer from JDK core developers too .
还有yet another question这与你的非常接近。
重要的是,这有时会导致问题,但有一个简单的解决方案 - 使用 lambda ,因此是显式类型,根据 JLS .

关于Java var 和推理类型歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66278909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com