gpt4 book ai didi

java - 解决java "Constructor call must be the first statement in a constructor"

转载 作者:行者123 更新时间:2023-12-01 06:48:39 29 4
gpt4 key购买 nike

我有一个类,它扩展了 Java 中的另一个类

我需要构造函数来运行 super 构造函数

这是我的基本代码:

public class Polygon implements Geometry {



public Polygon(Point3D... vertices) {
......
}
}

我想从子类中调用它

public class Triangle extends Polygon {

//ctor
public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3){
List<Point3D> _temp = null;
_temp.add(point3d);
_temp.add(point3d2);
_temp.add(point3d3);
super(_temp);
}

}

我该怎么做,因为我收到错误“构造函数调用必须是构造函数中的第一个语句”,但我需要构建构造函数

谢谢

最佳答案

super call always 必须是构造函数主体的第一条语句。你无法改变这一点。

如果需要,您可以将列表构建代码提取到单独的静态方法中 - 但在这种情况下,您实际上并不需要列表 - 您只需要一个数组,因为父类(super class) Point3D... vertices范围。所以你可以写:

public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3) {
// The vertices parameter is a varargs parameter, so the compiler
// will construct the array automatically.
super(point3d, point3d2, point3d3);
}

请注意,如果您的原始代码已编译,它仍然会失败并显示 NullPointerException因为您会尝试调用 _temp.add(...)_temp为空。

如果您确实想要/需要一个辅助方法,这里有一个示例:

public class Polygon implements Geometry{
public Polygon(List<Point3D> vertices) {
...
}
}

public class Triangle extends Polygon {
public Triangle(Point3D point3d, Point3D point3d2, Point3D point3d3) {
// The vertices parameter is a varargs parameter, so the compiler
// will construct the array automatically.
super(createList(point3d, point3d2, point3d3));
}

private static List<Point3D> createList(Point3D point3d, Point3D point3d2, Point3D point3d3) {
List<Point3D> ret = new ArrayList<>();
ret.add(point3d);
ret.add(point3d2);
ret.add(point3d3);
return ret;
}
}

请注意,有多种流畅的方法可以构建 List<T>无论如何,在单个表达式中 - 这实际上只是为了展示如何调用静态方法以便为父类(super class)构造函数提供参数。

关于java - 解决java "Constructor call must be the first statement in a constructor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60950789/

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