2011-12-15 85 views
5

我遇到这个问题时正在处理一个问题。为什么char转换为int类型而不是char转换为Java中的Integer

(int)input.charAt(i) //works 
(Integer)input.charAt(i) // Does not work 
// input being a string 

我首先想到的是原始图像被区别对待,这就是为什么这不起作用。但是后来我发现很难理解为什么他们首先会有一个Integer Wrapper类。

编辑: 然后有包装类的优点是什么?这仅仅是因为没有原始存在并且在设计上更多地面向对象?我发现很难理解如何有用。新的怀疑altogetehr。

+2

有趣。我会认为它可以是自动装箱的。 – DerMike 2011-12-15 10:44:11

回答

7

你说得对,基元对待不同。下面将工作:

(Integer)(int)input.charAt(i); 

不同的是,当参数为int(Integer)整数。即使它看起来像它也不是实际的演员。但是如果论点是char,那么这将是一次强制尝试;但基元不能转换为对象,因此它不起作用。你可以做的是首先投charint - 这个剧组是可以的,因为两者都是原始类型 - 然后int可以被装箱。

当然,char - >Integer拳击可能已经取得了工作。 “为什么不?”是一个很好的问题。对于这种功能来说,可能没有什么用处,尤其是当通过稍微更加明确的方式来实现相同的功能时。 (应char - >Long工作过,然后并且char - >Short字符是16位的,所以这将是最直接的?)。

答案编辑:包装类的好处是,包裹元可以像对象那样对待:例如存储在List<Integer>中。 List<int>不起作用,因为int不是一个对象。所以也许更相关的问题是,什么是OO语言中的原始非对象?答案在于性能:原语更快,占用更少的内存。用例决定了对象的方便性还是原语的性能更重要。

2

因为整数是Object。而char不是。你不能将一个非Object对象转换为某个Object。

Infact不能将某些对象转换为任何其他类不在该对象的层次结构中的类对象。

例如,你不能做到这一点

Integer g = (Integer) s; 

其中sString对象。

现在为什么聊天到int工作,因为每个字符在java中表示为unicode,所以你可以认为它在后端char是int的较小版本。 (int是32位,字符是16位)

+0

确实如此,但我认为汽车拳击会发生。 – gizgok 2011-12-15 10:45:22

+0

自动装箱仅适用于整数。这意味着当你将一个int转换为Integer时,你不必进行明确的转换。 @gizgok – Zohaib 2011-12-15 10:49:22