java - 实际参数 List<<anonymous Callable<String>>> 无法通过方法调用转换转换为 List<Callable<String>>

标签 java generics

我做了一个静态类方法(这里称为“函数”)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. 匿名类实际上是已声明接口(interface)/父类(super class)的子类
  2. 一个List<subclass> 不可分配给List<superclass>

关于java - 实际参数 List<<anonymous Callable<String>>> 无法通过方法调用转换转换为 List<Callable<String>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23797579/

相关文章:

java - <T extends Comparable<T>> 是什么意思?

c# - 将泛型 IEnumerable<T> 转换为 IEnumerable<KeyValuePair> (C#)

.net - 如何有效地打开表达式结果?

java - 使用 BufferedReader 从文件中读取行

java - 使用 GSON 在 Java 中解析 JSON 文件

JavaFX 自定义字体

java - 在通用上下文中使用 getActualTypeArguments

java - 我如何使用 Java 实现暴力攻击 TripleDES?

java.awt.IllegalComponentStateException

java - Java 5 中注释类型的编译时检查有何变化?