java - 使用Object类实现数学运算的多态性

标签 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 等也是如此

最佳答案

它不适用于不同的类型。

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 具有的方法,该方法可以采用您的两个通用或高级对象并自行进行类型转换或转换。

关于java - 使用Object类实现数学运算的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35489663/

相关文章:

algorithm - n 的四次方根的复杂度函数的大 O 表示法

java - 如何在java中找到给定范围内的百分比

java - RedisTemplate 导致 Fortify 动态代码评估中的不安全反序列化

java - Cassandra JDBC 是否提供数据源?

android - 每天准确重复报警(报警管理器)

android - 在android上的地理点之间绘制平滑线

python - 避免在 Python 模块 Sympy 中对参数进行排序

java - 将空对象转换为字符串

java - 在 Java 中对文件使用基于密码的加密

android - css + Android - 可滚动/ ListView 上没有点击响应