我有一个抽象类调用Task,它由Task1继承

public abstract class Task<STATUS extends Enum> {
  STATUS getStatus();
  void setStatus(STATUS status);
}

public class Task1 extends Task<TaskStatusEnum> {
  private TaskStatusEnum status;

  public Task1() {}

  public TaskStatusEnum getStatus() { return status; }
  public void setStatus(TaskStatusEnum status) { this.status = status; }
}

// Task2, Task3, Task4, ...

public enum TaskStatusEnum {
  PLANNED, STARTED, FINISH, FAILED;
}

我正在try 创建一个目标是更新任务状态的类

public class StateMachine {
  public StateMachine() {}

  public void startMultipleTasks(List<Task> tasks) {
    tasks.stream().forEach(task -> task.setStatus(TaskStatusEnum.STARTED));
  }
}

为什么不编译以下代码:

Task1 myTask = new Task1();
StateMachine stateMachine = new StateMachine();

List<Task1> allTasks = List.of(myTask);

stateMachine.startMultipleTasks(allTasks); // Compilation error ; Required type: List<Task> Provided: List<Task1>

但这确实是:

Task1 myTask = new Task1();
StateMachine stateMachine = new StateMachine();

stateMachine.startMultipleTasks(List.of(myTask));

我知道我可以将变量allTasks存储在List<Task>中,但我需要在代码中稍后使用List<Task1>.

注意:我使用的是Java 17

推荐答案

泛型是不变的,所以List<Task1>不被认为是List<Task>的子类型,尽管Task1扩展了Task.您可以改用bounded wildcard作为参数.

public void startMultipleTasks(List<? extends Task> tasks)

Java相关问答推荐

Java SSLocket查明客户端是否发送了证书

在Spring Boot中测试时出现SQL语法错误

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

使用GridBagLayout正确渲染

第二次按下按钮后,我需要将按钮恢复到其原始状态,以便它可以再次工作

PDFBox未加载内容

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

Arrays.hashcode(int[])为不同的元素提供相同的散列

在Eclipse中数组的可空性

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

如何在Java中为thunk创建映射器函数

Dijkstra搜索算法的实现

如何配置空手道以使用FeignClient或RestTemplate代替ApacheHttpClient

除0错误/抱歉我的句子是PT

视图被推出线性布局-Android

在实例化中指定泛型类型与不指定泛型类型之间的区别

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包