我有一个班级:
public abstract class Response<T> {
private boolean isSucessfull;
private T data;
public Response() {
throw new IllegalArgumentException();
}
public Response(boolean isSucessfull, T data) {
this.isSucessfull = isSucessfull;
this.data = data;
}
...
}
其他类使用某些特定类型扩展它:
public class PlainResponse extends Response<byte[]>{
//
}
当我尝试创建PlainResponse的实例时出现问题:new PlainResponse(success, responseData)
constructor PlainResponse in class PlainResponse cannot be applied to given types;
required: no arguments
found: boolean,byte[]
你可以猜到,我不是java的专家。但我已经预料到,我的班级将使用它的超级类的构造函数。
我怎样才能实现呢? 感谢。
答案 0 :(得分:4)
但是我已经预料到,我的班级将使用它的超类的构造函数。
事实并非如此。构造函数不是继承的。通常,子类以与其父类非常不同的方式创建,或者需要在其成员变量上强加其他不变量,因此通常让构造函数被继承不是一个好主意。
所以你必须定义一个构造函数
public PlainResponse(boolean isSucessfull, byte[] data) {
super(isSuccessfull, data);
// optionally more work
}
在PlainResponse
类和Response
的所有其他子类中。
如果没有在类中定义构造函数,Java将为您创建一个没有参数的默认构造函数。这就是您收到特定错误消息的原因。
答案 1 :(得分:0)
OOP 不允许将constructors
表单parent class
自动继承到child class
。这就是为什么如果给出这个错误就可以了
如果需要调用父类的构造函数,则在子类中声明一个带参数的构造,并从中调用super(arg1,arg2)
。
public class PlainResponse extends Response<byte[]>{
public PlainResponse(boolean isSucessfull, byte[] data)
{
super(isSucessfull,data);
}
}
答案 2 :(得分:0)
问题是构造函数不会在子类中继承,因此你得到一个没有参数的默认构造函数。 如果子类要调用父类的构造函数,那么你需要自己构造它。
public class PlainResponse extends Response<byte[]>{
public PlainResponse (boolean isSucessfull, T data) {
super(isSucessfull,data);
}
}