当前位置: 首页 > 知识库问答 >
问题:

我需要 Java 自定义自动装箱 [重复]

胡光霁
2023-03-14

可以用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
  }

但是我可以键入数字和数字表达式混合在一起作为参数吗?

共有2个答案

南宫凯康
2023-03-14

不,您无法定义自定义自动装箱

乔伯寅
2023-03-14
  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) {
           //...
       }
    }
 类似资料:
  • 问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使

  • 问题内容: 我是Java新手,因此对以下示例感到困惑。可以认为“ ==”符号会比较 Intger 和 Int中“自动装箱” Integer 之间的值,并比较Integer之间的引用地址吗? 那么双打和0/0呢? 结果是: 问题答案: 出现时,取消装箱将会进行。 例如: 但是何时出现,取决于情况。 如果boxing type出现在,它将进行比较。但是,如果base type出现在,而另一侧是boxi

  • 那么双打和0/0呢? 结果是:

  • 本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double 

  • 问题内容: 从JDK 5.0开始,自动装箱/拆箱是在Java中引入的,这种技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中的工作原理: Boxing 尝试不同的情况下后(),这是由编译器所接受的唯一情况是,当值的上做作运算符右侧的类型是int。当我查看源代码时,发现它仅实现一个带参数的构造函数。 因此,我的结论是,自动装箱的概念基于

  • 如果我有一个泛型参数,我通过模式匹配到基元(如 )来解析该参数,那么自动装箱是否比使用自定义包装器类型便宜?例如 对抗 第一种方法是否提供任何性能优势?如果该方法使用代替,这种情况是否相同: ?