繁体   English   中英

实际参数列表 <anonymous Callable<String> &gt;&gt;无法转换为列表 <Callable<String> &gt;通过方法调用转换

[英]actual argument List<<anonymous Callable<String>>> cannot be converted to List<Callable<String>> by method invocation conversion

我制作了一个静态类方法(在此称为“函数”) f ,该方法采用Callable<String>的列表:

import java.util.concurrent.*;
import java.util.*;
class A {
  static void f(List<Callable<String>> l) {}
  static <T> List<T> s(T t) {
    LinkedList<T> l = new LinkedList<T>();
    l.add(t);
    return l;
  }
  public static void main(String[] _) {
    f(s(new Callable<String>() {
      public String call() throws Exception {
        return "HI";
      }
    }));
  }
}

我创建了另一个函数s ,该函数将单个元素包装在列表中,因此我可以创建一个包含单个Callable的列表来测试f

除非我将Callable提取到变量中,否则它将无法编译。 为什么?

在eclipse中,它得到以下错误:

The method f(List<Callable<String>>) in the type A is not applicable for the arguments (List<new Callable<String>(){}>)

这很奇怪。 似乎在说一个表达式(产生一个值)是一种类型。 使用javac会得到不同的错误:

A.java:11: error: method f in class A cannot be applied to given types;
    f(s(new Callable<String>() {
    ^
  required: List<Callable<String>>
  found: List<<anonymous Callable<String>>>
  reason: actual argument List<<anonymous Callable<String>>> cannot be converted to List<Callable<String>> by method invocation conversion
1 error

f的签名更改为Callable的上限。

static void f(List<? extends Callable<String>> l) {}

这是必需的,因为:

  1. 匿名类实际上是声明的接口/超类的类。
  2. List<subclass> 不可分配给List<superclass>

该错误消息有点误导。 我猜是那样的,因为编译器尚未给匿名类型起一个名字(或选择不使用它)。 但基本上, List<SomeSubTypeOfCallable>不是List<Callable>的子类型,因此对于期望后者的方法来说不是有效的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM