是什么意思是(List<?>)从接口表示的"generics"对象列表到实现它的具体类型?



我正在开发一个Java应用程序,我对将实现接口的对象列表转换为特定具体对象的方法有以下疑问。我有以下代码,它运行良好,但我还没有完全理解语法的含义:

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

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

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

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

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

但我认为它不起作用,正确的方法是:

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

为什么?这个(列表(到底是什么意思?为什么我需要将其投射到列表中?

问题是泛型是不变的,下面是详细的解释。

所以写这个,例如:

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

不会起作用。

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

List<ExcelTabInterface> compVibrAndTempDTOListOriginal = new ArrayList<>();
List<?> parentOfAll = compVibrAndTempDTOListOriginal;
// a warning here
List<CompVibrAndTempDTO> compVibrAndTempDTOList = (List<CompVibrAndTempDTO>) parentOfAll;

最新更新