构造器无法应用于给定类型求助:Shape与Rectangle类构造代码排查
问题排查与解决方案
让我来帮你定位并解决这个编译错误,主要有两个核心问题需要修复:
1. 构造函数调用的语法错误(直接触发constructor cannot be applied to given types)
你的Rectangle构造函数里写了super(Point(0,0));,这是错误的Java对象创建语法——在Java中实例化对象必须使用new关键字,直接写Point(0,0)编译器会认为你在调用一个名为Point的方法,而不是创建Point类的实例,这就导致父类Shape的构造函数无法接收到正确的Point类型参数,从而抛出类型不匹配的编译错误。
更关键的是,你这里完全没必要传一个(0,0)的临时Point,直接把传入的p0传给父类构造函数就可以了,后面手动赋值position.x/y的操作完全是重复且多余的。
2. 父类Shape的构造函数存在空指针隐患
Shape类中position是Point类型的引用,但你在构造函数里直接对position.x和position.y赋值——此时position还没有被实例化(没有执行new Point()),运行时会直接抛出NullPointerException,这个问题也必须提前修复。
修正后的完整代码示例
首先修复Shape基类
abstract class Shape implements Comparable<Shape> { public Point position; public double area; public Shape(Point p) { // 正确初始化position对象,避免空指针 // 这里假设Point类有接收x、y坐标的构造函数 this.position = new Point(p.x, p.y); // 如果Point支持拷贝构造,也可以写成 this.position = new Point(p); } // 必须实现Comparable接口的compareTo方法,否则会编译错误 @Override public int compareTo(Shape other) { // 示例:按面积比较,你可以根据需求修改逻辑 return Double.compare(this.area, other.area); } }
然后修复Rectangle子类
public class Rectangle extends Shape { private double width; private double height; public Rectangle(Point p0, double w, double h) { // 直接将p0传给父类构造函数,由父类完成position的初始化 super(p0); this.width = w; this.height = h; // 计算并初始化面积 this.area = w * h; } }
配套的Point类示例(确保有对应的构造函数)
class Point { public double x; public double y; // 基础构造函数 public Point(double x, double y) { this.x = x; this.y = y; } // 可选:拷贝构造函数,方便复制Point实例 public Point(Point other) { this.x = other.x; this.y = other.y; } }
为什么这样修改?
- 修复了super调用的语法错误,确保父类构造函数能接收到正确的
Point类型参数,解决了编译报错的核心问题。 - 修复了
Shape构造函数的空指针隐患,保证position引用始终指向一个有效的Point实例。 - 移除了
Rectangle中重复的position赋值操作,让代码更简洁、符合面向对象的继承逻辑。
内容的提问来源于stack exchange,提问作者Papes Traore
相关产品推荐
相关产品推荐

