第1部分
对此没有令人满意的解决方案,因为java.lang.Number
没有指定任何对计算 a 的继任者有用的东西Number
。
您必须instanceof
检查数字框类型,并专门处理每种情况。另请注意,您可能会得到一个instanceof Number
非数字框类型,例如BigInteger
,AtomicLong
和可能未知的子类Number
(例如Rational
, 等)。
第2部分
看起来很骗人,在这里。这 3 种方法可能看起来很相似,但自动装箱/拆箱隐藏了它们在字节码级别实际上非常不同的事实:
Integer plusOne(Integer);
Code:
0: aload_1
1: invokevirtual #84; //int Integer.intValue()
4: iconst_1
5: iadd
6: invokestatic #20; //Integer Integer.valueOf(int)
9: areturn
Double plusOne(Double);
Code:
0: aload_1
1: invokevirtual #91; //double Double.doubleValue()
4: dconst_1
5: dadd
6: invokestatic #97; //Double Double.valueOf(double)
9: areturn
Long plusOne(Long);
Code:
0: aload_1
1: invokevirtual #102; //Long Long.longValue()
4: lconst_1
5: ladd
6: invokestatic #108; //Long Long.valueOf(long)
9: areturn
不仅这 3 个方法调用不同的xxxValue()
方法和valueOf()
不同类型的方法,而且将常量压入1
堆栈的指令也不同(iconst_1
、dconst_1
和lconst_1
)。
即使可以绑定一个像 的泛型类型<T=Integer|Long|Double>
,这 3 个方法也不能泛化为一个方法,因为它们包含非常不同的指令。