You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向对象编程新手求助:Java中抽象方法传递对象参数报错问题

Java抽象方法重写参数不匹配问题的解决方案

先来看你提供的代码:

abstract class FunctionInt{ 
    int num1; 
    int num2; 
    abstract FunctionInt test(FunctionInt newNum); 
} 
class Function extends FunctionInt{ 
    public Function(int num1,int num2){ 
        this.num1=num1; 
        this.num2=num2; 
    } 
    public Function (){ } 
    Function test(Function c){ 
        return c; 
    } 
}

错误原因

你碰到的编译问题核心在于Java方法重写的参数匹配规则:子类重写父类方法时,参数列表必须和父类方法完全一致。父类FunctionInt的test方法参数是FunctionInt类型,而子类Function里的test方法用了更具体的Function类型作为参数——这其实是定义了一个全新的重载方法,而非重写父类的抽象方法,导致父类的抽象方法没有被实现,编译自然报错。

修复方案

这里给你两个实用的解决思路:

方案一:调整参数类型并利用协变返回类型

把子类test方法的参数类型改成FunctionInt,同时利用Java的协变返回类型特性(子类重写方法时可以返回父类方法返回类型的子类),保留返回类型为Function。注意:这里的强制转换需要确保传入的实例确实是Function类型,否则会抛出类型转换异常。

修改后的代码:

abstract class FunctionInt{ 
    int num1; 
    int num2; 
    abstract FunctionInt test(FunctionInt newNum); 
} 
class Function extends FunctionInt{ 
    public Function(int num1,int num2){ 
        this.num1=num1; 
        this.num2=num2; 
    } 
    public Function (){ } 

    @Override
    public Function test(FunctionInt c) { 
        return (Function) c; 
    } 
}

方案二:使用泛型实现类型安全的重写

将抽象类改造为泛型类,通过泛型约束让子类可以指定具体的类型,这样既满足重写规则,又能保证类型安全,无需手动强制转换。

修改后的代码:

abstract class FunctionInt<T extends FunctionInt<T>> { 
    int num1; 
    int num2; 
    abstract T test(T newNum); 
}
class Function extends FunctionInt<Function> { 
    public Function(int num1,int num2){ 
        this.num1=num1; 
        this.num2=num2; 
    } 
    public Function (){ } 

    @Override
    public Function test(Function c) { 
        return c; 
    } 
}

内容的提问来源于stack exchange,提问作者Basta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:27:48