Java如何实现同时支持long[]与BigInteger[]的泛型多项式类?
Java多项式类高性能兼容原生long与BigInteger的实现方案
Java泛型采用类型擦除实现,不支持原生类型作为泛型参数,因此单一泛型数组的实现方案无法同时兼顾long[]的高性能和BigInteger[]的兼容性,最优解为使用抽象基类+分场景子类实现的架构:
1. 定义抽象多项式基类
抽象类定义所有多项式通用的方法签名,上层业务逻辑可直接依赖该抽象类实现两种实现的兼容:
import java.math.BigInteger; public abstract class Polynomial<T extends Number> { // 通用方法定义 public abstract T getCoefficient(int index); public abstract void setCoefficient(int index, T value); public abstract int getDegree(); // 其他多项式通用操作(求值、加法、乘法等)可在此定义抽象方法 }
2. 高性能原生long实现子类
底层直接使用long[]存储系数,额外提供原生类型的读写方法,完全避免装箱拆箱开销,性能拉满:
public class LongPolynomial extends Polynomial<Long> { private final long[] coefficients; public LongPolynomial(int size) { this.coefficients = new long[size]; } // 实现抽象方法,返回包装类,仅在需要兼容抽象类调用时使用 @Override public Long getCoefficient(int index) { return coefficients[index]; } // 原生类型getter,无任何装箱开销,性能优先场景调用 public long getCoefficientAsLong(int index) { return coefficients[index]; } @Override public void setCoefficient(int index, Long value) { coefficients[index] = value; } // 原生类型setter,无拆箱开销 public void setCoefficient(int index, long value) { coefficients[index] = value; } @Override public int getDegree() { for (int i = coefficients.length - 1; i >= 0; i--) { if (coefficients[i] != 0) return i; } return -1; } }
3. BigInteger大数实现子类
底层使用BigInteger[]存储系数,满足超范围数值的计算需求:
public class BigIntegerPolynomial extends Polynomial<BigInteger> { private final BigInteger[] coefficients; public BigIntegerPolynomial(int size) { this.coefficients = new BigInteger[size]; // 可按需初始化所有元素为BigInteger.ZERO } @Override public BigInteger getCoefficient(int index) { return coefficients[index]; } @Override public void setCoefficient(int index, BigInteger value) { coefficients[index] = value; } @Override public int getDegree() { for (int i = coefficients.length - 1; i >= 0; i--) { if (!BigInteger.ZERO.equals(coefficients[i])) return i; } return -1; } }
4. 可选:添加工厂类统一创建入口
无需暴露子类实现,直接通过工厂方法获取对应类型的多项式实例:
public class PolynomialFactory { public static Polynomial<Long> createLongPolynomial(int size) { return new LongPolynomial(size); } public static Polynomial<BigInteger> createBigIntegerPolynomial(int size) { return new BigIntegerPolynomial(size); } }
方案优势
- 性能达标:高频场景下使用
LongPolynomial的原生读写方法,性能和硬编码long[]的实现完全一致,无额外开销 - 兼容需求:大数场景直接使用
BigIntegerPolynomial,无需修改上层通用逻辑 - 可扩展性强:后续需要新增
Double等其他系数类型时,只需要新增对应子类即可
内容的提问来源于stack exchange,提问作者Rafaelo
相关产品推荐
相关产品推荐

