实际参数List&lt; <anonymous callable <string =“”>&gt;&gt;无法转换为List <callable <string>&gt;通过方法调用转换</callable <string> </anonymous>

时间:2014-05-22 03:57:34

标签: java generics

我制作了一个静态类方法(在此称为&#34;函数&#34;)f,其中列出了Callable<String> s:

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,它将一个元素包装在一个列表中,因此我可以在其中创建一个包含Callablef的列表来测试Callable

除非我将The method f(List<Callable<String>>) in the type A is not applicable for the arguments (List<new Callable<String>(){}>) 提取到变量中,否则无法编译。为什么呢?

在eclipse中,它出现了这个错误:

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

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

{{1}}

2 个答案:

答案 0 :(得分:3)

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

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

这是必要的,因为:

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

答案 1 :(得分:2)

错误消息有点误导。我猜这是因为编译器还没有为匿名类型命名(或选择不使用它)。但基本上,List<SomeSubTypeOfCallable>不是List<Callable>的子类型,因此不是期望后者的方法的有效参数。