为什么会有人这样做?
private Number genericObjectToNumber (Object obj)
{
if (obj instanceof Byte)
{
return(new Byte((Byte) obj));
}
else if (obj instanceof Short)
{
return(new Short ((Short) obj));
}
.....
else if(obj instanceof BigInteger)
{
return(BigInteger.ZERO.add ((BigInteger) obj));
}
return(null); // if it isn't a number, we don't want it
}
为什么不回归演员呢?为什么要浏览新对象的构造函数?为什么不问obj instanceof
if (obj instanceof Number)
{
return((Number)obj);
}
答案 0 :(得分:11)
我认为没有正当理由这样做。如果对象是可变的并且您想要创建这些对象的副本,则可能有意义。但原始包装类是不可变的,因此使用现有对象调用构造函数是没有意义的。
答案 1 :(得分:2)
我认为,作者试图制作一个通用的复制功能。 它的工作方式就像hes试图创建一个新对象,如果这个对象是一个数字,在一个新实例中返回一个数字; e.g:
字节(字节值) 构造一个新分配的Byte对象,该对象表示指定的字节值。
可能,如果它有意义,他可能有很多数据,并且在操作时不知道是否是数字。因此,他希望只使用数字操作,或者想要使用公共单位,并避免例外,如果不是数字。我不是说这是继续这些情况的方式,但它可能有意义(作为解释而非推荐,听起来像c ++程序编写代码)。 BTW,正如其他答案所注意到的那样,对象是不可变的,所以如果这是一个真实的例子,那就没有充分的理由。
答案 2 :(得分:1)
由于以下几个原因,这没有任何意义:
我能想到的唯一合理的理由是,如果列表中不包含所有类型的数字,并且程序员想要列出支持的数字类型,但即使这样,该方法也会被命名为
答案 3 :(得分:0)
因为原始代码显然是为了区分不同类型的数字。如果您刚刚返回“Number”,则obj将被转换为Number(即使它实际上不是数字)可能导致ClassCastException。通过使用原始代码,用户可以在某种程度上安全地将obj转换为正确的类型。