为什么char到int转换工作而不是char到Integer in Java

时间:2011-12-15 10:39:22

标签: java

当我遇到这个时,我正在解决一个问题。

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

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

修改 那么拥有包装类有什么好处?它只是因为没有原始存在而且在设计中更多OO吗?我发现很难理解tehy如何有用。新的怀疑altogetehr。

2 个答案:

答案 0 :(得分:7)

你是对的,原语区别对待。以下方法可行:

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

不同之处在于,当参数为int时,(Integer) 整数。它实际上并不是演员,即使它看起来像。但如果参数是char,那么它将是一次投射尝试;但是原始元素不能转换为对象,因此它不起作用。你可以做的是首先将char转换为int - 这个演员阵容没问题,因为两者都是原始类型 - 然后int可以装箱。

当然,char - &gt; Integer拳击可以已经成功。 “为什么不?”是一个很好的问题。可能没有什么用于这样的功能,特别是当通过稍微更明确地实现相同的功能时。 (char - &gt; Long也应该工作吗?char - &gt; Short?字符是16位,所以这将是最直接的。)< / p>

回答编辑:包装类的优点是包装的基元可以像对象一样对待:例如,存储在List<Integer>中。 List<int>不起作用,因为int不是对象。那么也许更相关的问题是,在OO语言中做什么是原始的非对象?答案在于性能:原语更快,内存更少。用例确定对象的方便性或基元的性能是否更重要。

答案 1 :(得分:2)

因为整数是Object。和char不是。你不能将非Object的东西投射到某个Object上。

事实上,您不能将某些Object强制转换为不在该Object层次结构中的任何其他类Object。

例如你不能这样做

Integer g = (Integer) s;

其中sString的对象。

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