Java:带参数的抽象泛型类构造函数

时间:2015-04-30 06:26:06

标签: java generics

我有一个班级:

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的专家。但我已经预料到,我的班级将使用它的超级类的构造函数。

我怎样才能实现呢? 感谢。

3 个答案:

答案 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);
    }
}