我有一系列相关课程。还有一些继承的东西似乎在抛弃我的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{
}
答案 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上也有很好的记录。
如果你只是谷歌的实际错误信息,你会发现很多详细的解释,这里有两个很长的时间。