我有一系列形状 ( SVGShape
) 并希望使用单一方法将它们添加到列表中(这将执行更多逻辑)。添加SVGCircle
的代码有效但重复。 SVGEllipse
的代码代表我想做的事情,所以只有一个方法不知道它传递的是哪种类型,但无法编译。一般类型是(我认为)List<? extends SVGShape>
但这禁止添加元素(在编译时)。
我正在尝试做的事情是可行的还是需要重写?
// SVGCircle extends SVGShape
// SVGEllipse extends SVGShape
// List<SVGEllipse> ellipseList;
// List<SVGCircle> circleList;
for (SVGShape shape : shapeList) {
if (shape instanceof SVGCircle) {
SVGCircle circle = (SVGCircle) shape; // this compiles and works
circleList.add(circle);
circle.setId("circle"+circleList.size());
} else if (shape instanceof SVGEllipse) {
SVGEllipse ellipse = (SVGEllipse) shape;
addToListAndSetId(ellipseList, ellipse); // fails to compile
}
}
private void addToListAndSetId(List<SVGShape> shapeList, SVGShape shape) {
shapeList.add(shape);
// more logic here
shape.setId(shape.getLocalName().toLowerCase() + shapeList.size());
}
注意:现在有 2 个答案给出了方法的正确形式。为了完整起见,这里是修改后的调用语法:
if (shape instanceof SVGCircle) {
addToListAndSetId(circleList, (SVGCircle) shape);
} else if (shape instanceof SVGEllipse) {
addToListAndSetId(ellipseList, (SVGEllipse) shape);
}
最佳答案
如果您将方法的签名更改为 void addToListAndSetId(List<? extends SVGShape>, SVGShape shape)
, 它不允许添加到 List
,因为没有什么能阻止你传递给方法 a List<SVGEllipse>
用SVGRectangle
(您不应该将其添加到 List
中)。
您可以将泛型类型参数添加到您的方法中:
private <T extends SVGShape> void addToListAndSetId(List<T> shapeList, T shape) {
shapeList.add(shape);
// more logic here
shape.setId(shape.getLocalName().toLowerCase() + shapeList.size());
}
如果第一个参数是 List<SVGEllipse>
, 第二个参数必须是 SVGEllipse
,可以安全地添加到该列表中。
关于java - 更正泛型类型以将对象添加到方法中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49476707/