相关疑难解决方法(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 8方法引用

我遇到了Java 8方法引用与泛型类型相结合的问题.我已经简化了我的问题,以明确问题所在.以下代码失败:

public static void main(String[] args) {
    new Mapper(TestEvent::setId);
}

private static class Mapper<T> {
    private BiConsumer<TestEvent, T> setter;
    private Mapper(BiConsumer<TestEvent, T> setter) { this.setter = setter; }
}

private static class TestEvent {
    public void setId(Long id) { }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将构造函数调用更改为

    BiConsumer<TestEvent, Long> consumer = TestEvent::setId;
    new Mapper(consumer);
Run Code Online (Sandbox Code Playgroud)

一切正常.有人可以解释原因吗?

我知道如果我删除泛型类型(T)并使用Long代替它可行,但在解决我的实际问题时这不起作用.

java generics lambda java-8

10
推荐指数
1
解决办法
3563
查看次数

标签 统计

generics ×2

java ×2

java-8 ×2

lambda ×2