小编Sco*_*son的帖子

使用泛型和lambdas重载方法时调用不明确的方法

我注意到了使用泛型和lambdas重载方法的奇怪行为.这个类工作正常:

  public <T> void test(T t) { }

  public <T> void test(Supplier<T> t) { }

  public void test() {
    test("test");
    test(() -> "test");
  }
Run Code Online (Sandbox Code Playgroud)

没有模糊的方法调用.但是,将其更改为此会使第二个调用变得模糊:

  public <T> void test(Class<T> c, T t) { }

  public <T> void test(Class<T> c, Supplier<T> t) { }

  public void test() {
    test(String.class, "test");
    test(String.class, () -> "test"); // this line does not compile
  }
Run Code Online (Sandbox Code Playgroud)

怎么会这样?为什么添加另一个参数导致方法解析不明确?为什么它能说明第一个例子中供应商和对象之间的区别,而不是第二个例子?

编辑:这是使用1.8.0_121.这是完整的错误消息:

error: reference to test is ambiguous
    test(String.class, () -> "test");
    ^
  both method <T#1>test(Class<T#1>,T#1) in TestFoo and method …
Run Code Online (Sandbox Code Playgroud)

java generics lambda

7
推荐指数
1
解决办法
568
查看次数

标签 统计

generics ×1

java ×1

lambda ×1