【发布时间】:2020-05-23 12:20:09
【问题描述】:
有一个在集合中使用继承和泛型的分层模型,我有一个与 capture conversion 相关的编译错误:
CaptureConversion.java:16: error: incompatible types: NodeModel cannot be converted to CAP#1
treeModel.getNodes().set(0, primaryNode);
^
where CAP#1 is a fresh type-variable:
CAP#1 extends PublicNodeModel from capture of ? extends PublicNodeModel
我能够克服这个错误的唯一方法是通过以下转换方法:
private static <T extends PublicNodeModel> T convert(PublicNodeModel node) {
return (T) node;
}
这种转换对我来说看起来很傻,所以我的问题是是否有一些“正确”的方式来处理 Java 中的这种转换?
导致此错误的模型和代码如下(GitHub 上的完整 runnable example)。
简化模型(例如,没有 getter/setter 等):
class PublicTreeModel {
List<? extends PublicNodeModel> nodes = new ArrayList<>();
}
class TreeModel extends PublicTreeModel {}
class PublicNodeModel {}
class NodeModel extends PublicNodeModel {}
导致编译错误的用法:
TreeModel treeModel = Fixture.createModel();
int index = Fixture.indexOfPrimaryNode(treeModel.getNodes());
NodeModel primaryNode = (NodeModel) treeModel.getNodes().get(index);
// following two lines won't compile
treeModel.getNodes().set(index, treeModel.getNodes().get(0));
treeModel.getNodes().set(0, primaryNode);
使用上述修复(convert() 方法):
// this will compile & run
treeModel.getNodes().set(index, convert(treeModel.getNodes().get(0)));
treeModel.getNodes().set(0, convert(primaryNode));
【问题讨论】:
标签: java generics type-conversion