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

标签 java generics

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

相关文章:

Java 7 在 Win7 上创建路径为 230 个字符的文件失败

c# - 使用泛型将类库 DLL 公开给 COM

java - 实例化 map 列表时获取 'Type mismatch: cannot convert from ArrayList<HashMap<String,String>> to List<Map<String,String>>'

java - 泛型 - 为什么类类型变量在静态上下文中无效?

java - JSF setLocale 不能正常工作

Java Scanner指定行分隔符

java - 在 Java Swing 中合并两个选项卡

java - 如何使用 Java 8 流将字符串数组转换为大整数数组

java - 带有必须实现 Serialized 的参数的静态方法

java - 从自定义数据结构类返回流