2015-04-30 149 views
1

我有一个类:的Java:抽象泛型类构造函数的参数

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

请注意,如果您首先在“响应”中没有无参数的构造函数,则不会遇到此问题。鉴于在没有引发异常的情况下实际调用是不可能的,因此最好不要将它首先定义。然后编译器可以要求'PlainResponse'有一个调用父'(boolean,T)'构造函数的构造函数。 – dimo414

回答

3

但我期望,我的课程将使用它的超类的构造函数。

事实并非如此。构造函数不会被继承。通常,子类的创建方式与其父类完全不同,或者需要对其成员变量添加额外的不变量,所以通常让构造函数被继承并不是一个好主意。

所以,你会在你的PlainResponse类的Response所有其他子类定义构造函数

public PlainResponse(boolean isSucessfull, byte[] data) { 
    super(isSuccessfull, data); 
    // optionally more work 
} 

如果您没有在类中定义构造函数,Java将为您创建一个没有参数的默认构造函数。这是您收到特定错误消息的原因。

+0

不太确定第一个断言。所有成员变量在Java中都有初始值;因为你总是可以写一个只包含'super(same-arguments)'的构造函数,所以语言可能已经规定构造函数可以被继承并且只调用超类的构造函数是“可能的”。但这可能不是一个好主意。它引发了太多的事故。 – ajb

+0

@ajb。好点子。我相应地编辑了答案。 – Hoopje

0

OOP 不允许自动继承constructors形式parent classchild class。这就是为什么如果出现这个错误是没问题的

如果您需要调用父类的构造函数,在子类中声明一个带有参数的构造函数,并从中调用super(arg1,arg2)

public class PlainResponse extends Response<byte[]>{ 

    public PlainResponse(boolean isSucessfull, byte[] data) 
    { 
     super(isSucessfull,data); 
    } 
} 
0

问题是构造函数不会在子类中继承,所以你得到一个没有参数的默认构造函数。 如果子类调用父类的构造函数,那么你需要做它自己的构造函数。

public class PlainResponse extends Response<byte[]>{ 
    public PlainResponse (boolean isSucessfull, T data) { 
     super(isSucessfull,data); 
    } 
}