[英]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) {}
這是必需的,因為:
List<subclass>
不可分配給List<superclass>
該錯誤消息有點誤導。 我猜是那樣的,因為編譯器尚未給匿名類型起一個名字(或選擇不使用它)。 但基本上, List<SomeSubTypeOfCallable>
不是List<Callable>
的子類型,因此對於期望后者的方法來說不是有效的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.