gpt4 book ai didi

java - 更正泛型类型以将对象添加到方法中的列表

转载 作者:行者123 更新时间:2023-11-29 06:50:40 25 4
gpt4 key购买 nike

我有一系列形状 ( 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/

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