簡體   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