java - 我需要 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
}
但是我可以输入Number
并NumberExpression
混合在一起作为参数吗?
解决方案
- 就像人们说的那样做不到
- 您的问题通常如何解决是您自己包装值并且只有一种方法(查看 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) {
//...
}
}
推荐阅读
- python - 使用日期时间转换日期列表的神秘问题
- javascript - Javascript 转换/更改为布尔值
- go - 如何在函数级别而不是 GoLang 平台中进行元编程或条件编译?
- node.js - Skrill Quick Checkout 中的 MSID 生成
- ios - 如何在不使用 tableView.reloadData() 的情况下访问 Swift 中闭包之外的数据?
- java - 在 Antlr4 中找不到符号
- python - 如何在 qweb 报告中创建显示产品变型组合的表格?
- php - 如何使用 htaccess 将网站从非安全网站重定向到安全网站
- java - 如何使用 PrintStream 类读写文件?
- javascript - Javascript 使用带有数组列表的 for 循环