首页 > 解决方案 > 我需要 Java 自定义自动装箱

问题描述

是否可以在 Java 中定义自定义自动装箱?

键入函数的参数时,我需要自动转换java.lang.Number为我的类。org.expr.NumberExpression对于两个参数,我最终编写了四个非常相似的方法:

public class Assemble {

  public NumberExpression add(NumberExpression a, NumberExpression b) {
    // do something
  }

  public NumberExpression add(NumberExpression a, Number b) {
    return add(a, new NumberConstant(b));
  }

  public NumberExpression add(Number a, Number b) {
    return add(new NumberConstant(a), new NumberConstant(b));
  }

  public NumberExpression add(Number a, NumberExpression b) {
    return add(new NumberConstant(a), b);
  }

}

所以我可以输入:

assemble.add(5, assemble.add(7, 3));
assemble.add(5, assemble.add(7, 3), 8, 15); // does not work

但是,我认为这对于 10 个参数(我想做的)变得难以管理;我想我需要编写 1024 个类似的方法。

我正在考虑的另一个解决方案是编写如下方法:

  public NumberExpression add(NumberExpression... numbers) {
    // do something
  }

但是我可以输入NumberNumberExpression混合在一起作为参数吗?

标签: javaautoboxing

解决方案


  1. 就像人们说的那样做不到
  2. 您的问题通常如何解决是您自己包装值并且只有一种方法(查看 BigDecimal)
assemble.add(
    new IntegerConstant(5),
    assemble.add(new IntegerConstant(7), new IntegerConstant(3))

或使用工厂:

assemble.add(
    NumberExpression.of(5),
    assemble.add(NumberExpression.of(7), NumberExpression.of(3))

在哪里:

   class NumberExpression {
       public static IntegerConstant of(Integer v) {
           //...
       }

       public static DoubleConstant of(Double v) {
           //...
       }
    }

推荐阅读