这不是家庭作业。
Part 1
是否可以编写一个通用方法,如下所示:
<T extends Number> T plusOne(T num) {
return num + 1; // DOESN'T COMPILE! How to fix???
}
缺少使用一堆instanceof
和演员阵容,这可能吗?
Part 2
以下3种方法编译:
Integer plusOne(Integer num) {
return num + 1;
}
Double plusOne(Double num) {
return num + 1;
}
Long plusOne(Long num) {
return num + 1;
}
是否可以编写一个通用版本来绑定T
只到Integer
, Double
, or Long
?
Part 1
对此没有令人满意的解决方案,因为java.lang.Number没有指定任何对计算 a 的后继有用的内容Number
.
你必须做instanceof
检查数字框类型,并特殊处理每种情况。另请注意,您可能会得到instanceof Number
这不是任何数字框类型,例如BigInteger
, AtomicLong
,以及潜在未知的子类Number
(e.g. Rational
, etc).
Part 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()
and valueOf()
不同类型的方法,但推送常量的指令1
到堆栈也不同(iconst_1
, dconst_1
, and lconst_1
).
即使可以绑定像这样的泛型类型<T=Integer|Long|Double>
,这 3 种方法不能泛化为一种方法,因为它们包含非常不同的指令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)