java 重写方法报错

博客提及Java相关异常提醒,涉及pagedResult.java和PageInfo.java文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019-03-20 1447 星期三

异常提醒

Name clash: The method setData(List<Object>) of type new PagedResult(){} 
has the same erasure as setData(List) of type PagedResult but does not override it

pagedResult.java

package com.china.demo.platform.common.vo;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.china.demo.platform.common.exception.BaseException;

@SuppressWarnings({"unchecked","rawtypes"})
public class PagedResult<T>{
	private List<T> data;
	private long total;
	private PageInfo info;
	private Map<String, Object> addtions;
	  
	public PagedResult(List<T> data, long total, int pageIndex, int pageSize){
	    this.data = data;
	    this.total = total;
	    this.info = new PageInfo(pageIndex, pageSize, total);
	}
	
	public static final PagedResult<Object> EMPTY = new PagedResult(Collections.emptyList(), 0L, 1, 10)  {
	    /**
	     * 2019-03-20 1443 出现异常 
	     * Name clash: The method setData(List<Object>) of type new PagedResult(){} 
	     * 	 has the same erasure as setData(List) of type PagedResult but does not override it
	     */
		public void setData(List<Object> data){
	    	throw new BaseException("不允许调用EMPTY的setData()方法!");
	    }
	    public void setTotal(long total){
	      throw new BaseException("不允许调用EMPTY的setTotal()方法!");
	    }
	};
 
  
  public List<T> getData(){
    return this.data;
  }
  
  public void setData(List<T> data){
    this.data = data;
  }
  
  public long getTotal(){
    return this.total;
  }
  
  public void setTotal(long total) {
    this.total = total;
  }
  
  public PageInfo getInfo()  {

    return this.info;
  }
  
  public void putAddition(String key, Object value) {
    if (this.addtions == null) {
      this.addtions = new HashMap();
    }
    this.addtions.put(key, value);
  }
  
  public Map<String, Object> getAdditions()  {
    if (this.addtions != null) {
      return Collections.unmodifiableMap(this.addtions);
    }
    return null;
  }
}

PageInfo.java

package com.china.demo.platform.common.vo;

public class PageInfo
{
  private int next;
  private int prev;
  private int totalPage;
  private int pageIndex;
  private int pageSize;
  
  public PageInfo(int pageIndex, int pageSize, long total)
  {
    this.pageIndex = pageIndex;
    this.pageSize = pageSize;
    this.totalPage = ((int)(total / pageSize));
    if (total % pageSize != 0L) {
      this.totalPage += 1;
    }
    this.next = (pageIndex >= this.totalPage ? pageIndex : pageIndex + 1);
    this.prev = (pageIndex < 2 ? 1 : pageIndex - 1);
  }
  
  public int getNext()
  {
    return this.next;
  }
  
  public int getPrev()
  {
    return this.prev;
  }
  
  public int getFirst()
  {
    return 1;
  }
  
  public int getLast()
  {
    return this.totalPage;
  }
  
  public int getTotalPage()
  {
    return this.totalPage;
  }
  
  public int getPageIndex()
  {
    return this.pageIndex;
  }
  
  public int getPageSize()
  {
    return this.pageSize;
  }
}

 

<think>好的,我现在需要解决用户关于Java重写方法时返回值类型不一致导致错误的问题。首先,我得回忆一下方法重写的基本规则。根据引用[2],重写方法必须和父类方法原型一致,包括返回值类型、方法名和参数列表。不过,这里提到被重写方法返回值类型可以不同,但必须是父子关系。这可能涉及到协变返回类型的概念。用户的问题集中在返回值类型不一致导致的错误原因和解决方法。我需要先解释为什么返回值类型不一致会引发错误。根据Java的规则,重写方法时,如果返回值类型不兼容,比如不是父类返回类型的子类,编译器会报错。例如,父类方法返回Object,子类试图返回String,这其实是允许的,因为String是Object的子类,这就是协变返回类型。但如果反过来,或者完全没有继承关系,就会出错。 然后,需要引用相关的资料来支持。引用[2]中提到,返回值类型必须完全一致,除非有父子关系。这可能用户有误解,需要澄清。同时引用[4]指出,方法重载和重写的区别,其中重写的返回值类型不能修改,除非构成父子类关系。这进一步说明协变返回类型的情况。 接下来,解决方案部分需要分情况讨论。一种是保持返回值类型严格一致,另一种是使用协变返回类型。同时,提醒使用@Override注解来帮助检测错误,如引用[2]和[1]提到的,这能帮助编译器检查是否正确重写。 还要考虑用户可能的误区,比如误将重载当作重写,或者不知道协变返回类型的存在。需要举例说明正确和错误的代码,帮助用户理解。例如,父类返回Number,子类返回Integer是允许的;但父类返回String,子类返回Object就会报错。 最后,生成相关问题,确保覆盖用户可能关心的其他方面,比如重写与重载的区别、@Override的作用、访问权限的影响等,参考引用中的信息,尤其是引用[2]和[4]提到的内容。</think>在Java重写方法时返回值类型不一致会导致编译错误,这是由Java语言规范对方法重写的严格约束所决定的。以下是具体原因及解决方案: ### 一、错误原因分析 1. **基本规则冲突** 根据Java规范,子类重写父类方法时,必须满足: $$返回值类型\ 兼容 \quad \land \quad 方法名相同 \quad \land \quad 参数列表相同$$ 若返回值类型不兼容,编译器会报错: ```java class Father { public Number getValue() { return 1; } } class Son extends Father { public String getValue() { return "error"; } // 编译错误: 不兼容的返回值类型 } ``` 2. **协变返回类型例外** 唯一允许的返回值不一致情况是**协变返回类型**(子类方法的返回值是父类方法返回值的子类): ```java class Father { public Number getValue() { return 1; } } class Son extends Father { public Integer getValue() { return 2; } // 合法,Integer是Number的子类 } ``` 3. **与重载混淆** 若尝试通过修改返回值类型实现重载(而非重写),需保证方法签名不同: ```java class Father { public void process(int x) {} } class Son extends Father { public int process(int x) { return x; } // 编译错误:返回值类型不同但签名相同 } ``` [^2][^4] ### 二、解决方案 | 场景 | 解决方案 | 示例代码 | |------|----------|----------| | 需要严格重写 | 保持返回值类型完全一致 | `父类:String getName()`<br>`子类:String getName()` | | 需要扩展返回类型 | 使用协变返回类型 | `父类:Object create()`<br>`子类:Product create()` | | 需要功能扩展 | 改用重载(修改参数列表) | `父类:void execute(int x)`<br>`子类:void execute(String s)` | ### 三、最佳实践 1. **使用@Override注解** 强制编译器检查重写合法性: ```java @Override public Integer getValue() { return 2; } // 自动检测返回值兼容性 ``` [^1][^2] 2. **验证类型继承关系** 通过`instanceof`判断协变返回类型是否有效: ```java public Animal getAnimal() { return new Cat(); // Cat必须是Animal的子类 } ``` 3. **避免违反访问权限** 返回值类型调整不能导致访问权限降低(如父类返回public类型,子类不能返回protected类型)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值