相关疑难解决方法(0)

Java8:lambdas和重载方法的歧义

我正在玩java8 lambdas,我遇到了编译器错误,我没想到.

假设我有一个函数interface A,一个abstract class B和一个class C重载方法,它们可以采用AB作为参数:

public interface A { 
  void invoke(String arg); 
}

public abstract class B { 
  public abstract void invoke(String arg); 
}

public class C {
  public void apply(A x) { }    
  public B apply(B x) { return x; }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以传入一个lambda c.apply,它正确地解决了c.apply(A).

C c = new C();
c.apply(x -> System.out.println(x));
Run Code Online (Sandbox Code Playgroud)

但是当我更改B作为泛型版本的参数的重载时,编译器报告两个重载是不明确的.

public class C {
  public void apply(A x) { …
Run Code Online (Sandbox Code Playgroud)

java generics lambda java-8

38
推荐指数
2
解决办法
7963
查看次数

Java var 和推理类型歧义

两个调用都是正确的:

Collectors.groupingBy((String s)->s.toLowerCase(),Collectors.counting());
Collectors.groupingBy((String s)->s.toLowerCase(Locale.ENGLISH),Collectors.counting());
Run Code Online (Sandbox Code Playgroud)

从那以后,为什么下面一个是错误的:

Collectors.groupingBy(String::toLowerCase,Collectors.counting());
Run Code Online (Sandbox Code Playgroud)

毕竟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());
Run Code Online (Sandbox Code Playgroud)

这是正确的,但是在 Java 10 var 推理类型上下文中这是错误的:

var c = Collectors.groupingBy(String::toLowerCase,Collectors.counting());
Run Code Online (Sandbox Code Playgroud)

我知道编译器无法推断counting. 如果我写:

Collector<String,?,Long> counter = Collectors.counting();
var c = Collectors.groupingBy(String::toLowerCase,counter);
Run Code Online (Sandbox Code Playgroud)

它是正确的。因此,为什么编译器不能推断出唯一可接受的形式?

- - - -编辑 - - - -

我交替使用 IntelliJ/编译器只是因为我首先使用 IntelliJ 并且报告的错误是:

Reference to 'toLowerCase' is ambiguous, both 'toLowerCase(Locale)' and 'toLowerCase()' match
Run Code Online (Sandbox Code Playgroud)

编译器的错误更难以理解(但包含更多关于推理失败原因的提示),例如:

Demo.java:31: error: …
Run Code Online (Sandbox Code Playgroud)

java type-inference java-10

16
推荐指数
1
解决办法
312
查看次数

标签 统计

java ×2

generics ×1

java-10 ×1

java-8 ×1

lambda ×1

type-inference ×1