IDE中的“不兼容的类型”错误,但代码编译

时间:2013-09-10 15:46:25

标签: java inheritance

我有一系列相关课程。还有一些继承的东西似乎在抛弃我的IDE。但是我的代码编译得很好。

在我的响应子类中,我试图将errors字段限制为仅包含错误子类。理想情况下,我希望公共getter返回List<GWSError>,这样我就不必继续将它转换为我们该方法的其他类。我试图覆盖继承的getter和setter来执行此操作,但我的IDE一直给我一个不兼容的类型错误。 NetBeans和Eclipse都会在相同的方法上出错。

我在下面列出了我的代码示例以澄清这一点。为清楚起见,省略了与此问题无关的代码。

正如我所提到的,当我直接使用Maven编译时,我没有遇到任何编译器错误。

这让我觉得必须有更好的方法来实现这一目标。但我不知道那是什么。


基本响应类

public class WSResponse {

    protected List<WSError> errors;

    public List<WSError> getErrors(){
        if(errors == null){
            setErrors(new ArrayList<WSError>());
        }

        return errors;
    }

    public void setErrors(List<WSError> errors) {
        this.errors = errors;
    }
}

响应子类

public class GResponse extends WSResponse{

    @Override //IDE Error: getErrors() in GResponse cannot override getErrors() in WSResponse; return type List<GWSError> is not compatible with List<WSError>
    public List<GWSError> getErrors(){
        if(errors == null){
            errors = new ArrayList<GWSError>();
        }

        return errors;
    }

    @Override  //IDE Error: name clash: setErrors(List<GWSError>) in GtmResponse and setErrors(List<WSError>) in WSResponse have the same erasure, yet neither overrides the other
    public void setErrors(List<GWSError> errors){
        this.errors = errors;
    }

    public void addError(GWSError error){
        getErrors().add(error);
    }
}

基本错误类

public class WSError {

}

错误子类

public class GWSError extends WSError{

}

2 个答案:

答案 0 :(得分:1)

首先,您应该了解泛型是不变的。因此,您无法将返回类型从List<WSError>更改为List<GWSError>

  

当我直接使用Maven编译它时,我没有遇到任何编译器错误。

令我惊讶的是。您的代码当前无法在任何Java编译器级别下编译。

我想你应该让你的WSResponse类通用。这样,您可以轻松创建并行继承层次结构,就像您尝试在您的情况下那样。因此,请将您的课程修改为:

class WSResponse<T extends WSError> {
    protected List<T> errors;

    public List<T> getErrors(){
        if(errors == null){
            setErrors(Collections.<T>emptyList());
        }

        return errors;
    }

    public void setErrors(List<T> errors) {
        this.errors = errors;
    }
}

然后扩展此类的具体参数化类型:

class GResponse extends WSResponse<GWSError> {

    @Override
    public List<GWSError> getErrors() {
        return super.getErrors();
    }

    @Override
    public void setErrors(List<GWSError> errors) {
        super.setErrors(errors);
    }
}

答案 1 :(得分:0)

这是因为泛型和类型擦除,方法是相互矛盾的,因为它们在编译后基本上都是List

List<GWError>不会从List<WSError>继承,这不是它在Java中的工作方式。

这一点在SO以及Google上也有很好的记录。

如果你只是谷歌的实际错误信息,你会发现很多详细的解释,这里有两个很长的时间。