如何让Java函数兼容两个含共同属性的不同输入类?
解决方案:使用接口实现多态复用
在Java中,你可以通过定义公共接口来约定类A和类B的共同行为,让函数F基于这个接口编写,从而实现对不同类的复用,无需重复代码。具体步骤如下:
1. 定义公共接口
创建一个接口,声明函数F需要用到的两个方法:getNumerator()和getDenominator(),任何实现该接口的类都能被F接收。
interface Fractional { Long getNumerator(); Long getDenominator(); }
2. 修改类A和类B实现该接口
让类A和类B实现上述Fractional接口,由于它们已经有对应的getter方法,只需在类声明中添加接口实现即可:
class A implements Fractional { Long numerator; Long denominator; String firstName; // 已有的getter和setter @Override public Long getNumerator() { return numerator; } @Override public Long getDenominator() { return denominator; } // 其他属性的getter/setter } class B implements Fractional { Long numerator; Long denominator; String address; // 已有的getter和setter @Override public Long getNumerator() { return numerator; } @Override public Long getDenominator() { return denominator; } // 其他属性的getter/setter }
3. 修改函数F的参数类型
将函数F的输入参数从Class改为Fractional接口,这样它就能接收任何实现了该接口的对象(包括A和B的实例):
Double F(Fractional input) { // 注意:Long直接相除会触发整数除法,转成double避免精度丢失 return input.getNumerator().doubleValue() / input.getDenominator().doubleValue(); }
补充说明
- 选择接口而非抽象类的原因:接口更适合单纯的行为约定,不会限制类的继承结构(Java是单继承多实现)。
- 原代码中
Long类型直接相除会丢失小数部分,调用doubleValue()转成浮点型后再计算,才能得到正确的小数结果。
内容的提问来源于stack exchange,提问作者ripunjoym1998
相关产品推荐
相关产品推荐

