我正在开发一个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;