gpt4 book ai didi

java - (List) 从接口(interface)表示的 "generics"对象列表到实现它的具体类型意味着什么?

转载 作者:行者123 更新时间:2023-12-02 08:51:09 26 4
gpt4 key购买 nike

我正在开发一个 Java 应用程序,对于将实现接口(interface)的对象列表转换为特定的具体对象的正确方法,我有以下疑问。我有以下代码,它工作正常,但我不完全理解语法的含义:

List<ExcelTabInterface> compVibrAndTempDTOListOriginal =  excelService.getCompVibrAndTempTab();

List<CompVibrAndTempDTO> compVibrAndTempDTOList = (List<CompVibrAndTempDTO>)(List<?>) compVibrAndTempDTOListOriginal;

正如您在第一行中看到的,我调用了一个方法来获取实现名为 ExcelTabInterface 的接口(interface)的对象列表。因此,此列表包含实现我的 ExcelTabInterface 接口(interface)的任何对象。

然后我需要将此列表转换为实现我的接口(interface)的具体对象的列表,我已经用第二行完成了它。我将原始列表转换为 CompVibrAndTempDTO 列表(这是一个实现我的 ExcelTabInterface 的类)。

一开始我预计代码应该是这样的:

List<CompVibrAndTempDTO> compVibrAndTempDTOList = (List<CompVibrAndTempDTO>) compVibrAndTempDTOListOriginal;

但我发现它不起作用,正确的方法是:

List<CompVibrAndTempDTO> compVibrAndTempDTOList = (List<CompVibrAndTempDTO>)(List<?>) compVibrAndTempDTOListOriginal;
为什么?这个 (列表)到底是什么意思?为什么我需要将其转换到 列表中?

最佳答案

问题是泛型是不变的,here is the long explanation .

所以写这个,例如:

List<ExcelTabInterface> compVibrAndTempDTOListOriginal = new ArrayList<>();
List<CompVibrAndTempDTO> compVibrAndTempDTOList = compVibrAndTempDTOListOriginal;

不会工作。

但是,如果您首先分配给“ super 类型”或“所有通用列表的父级”(我没有更好的名称),然后缩小到一个类型,则编译器必须信任您(通过警告) ),因为这可能是真的:

    List<ExcelTabInterface> compVibrAndTempDTOListOriginal = new ArrayList<>();
List<?> parentOfAll = compVibrAndTempDTOListOriginal;

// a warning here
List<CompVibrAndTempDTO> compVibrAndTempDTOList = (List<CompVibrAndTempDTO>) parentOfAll;

关于java - (List<?>) 从接口(interface)表示的 "generics"对象列表到实现它的具体类型意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com