使用Object类在数学运算中实现多态

时间:2016-02-18 18:33:34

标签: java android math polymorphism

在数学类的对象之间实现数学运算时,我想在java中充分利用多态 我从How to add two java.lang.Numbers?的答案中得到了答案 使用java.lang.Number时的一般解决方案是知道或检查真实对象类并进行适当的硬编码转换为float,int等。

但这种方法实际上不是面向对象的。 java语言设计者选择为java.lang.Number类及其派生类提供一组方法floatValue()intValue()等等。

鉴于此,我提议的方法是否会起作用?

为了以无缝方式实现数学运算,我想重写Number类Hierarchy以允许执行以下操作:

MyNumber a = b.getValue() + c.getValue();  

bc的实际类型不重要

基类是:

public abstract class MyNumber {
   protected Object mValue;

   public abstract <N> N getValue();
}

并且,例如,我的整数类看起来像:

public class MyInteger extends MyNumber {
    public MyInteger(int value) {
        mValue = value;
    }

    @Override
    public Integer getValue() {
        return (Integer) mValue;
    }
}

和MyFloat,MyDouble等类似。

1 个答案:

答案 0 :(得分:0)

它不适用于不同类型。

public class MyInteger extends MyNumber {
    public MyInteger(int value) {
        mValue = value;
    }

    @Override
    public Integer getValue() {
        return (Integer) mValue;
    }
}

public class MyFloat extends MyNumber {
    public MyFloat(float value) {
        mValue = value;
    }

    @Override
    public Float getValue() { // first issue: types don't match. can't override
        return (float) mValue; // second issue: type won't match with other getValue methods, arithmetic will fail
    }
}

你的问题甚至在算术之前。您需要使用泛型或某种类型解析和/或类型转换机制来解决此问题。

首先,覆盖方法需要具有匹配的签名,而类型是该签名的一部分。

其次,在拥有单一类型Java does not have operator overloading之后。因此,您需要实现MyNumber具有的方法,该方法可以使用两个Generic或高级Object,并自行进行类型转换或转换。