当我遇到这个时,我正在解决一个问题。
(int)input.charAt(i) //works
(Integer)input.charAt(i) // Does not work
// input being a string
我的第一个想法是原语被区别对待,这就是为什么这不起作用。但后来我发现很难理解为什么他们首先会有一个Integer Wrapper类。
修改 那么拥有包装类有什么好处?它只是因为没有原始存在而且在设计中更多OO吗?我发现很难理解tehy如何有用。新的怀疑altogetehr。
答案 0 :(得分:7)
你是对的,原语被区别对待。以下方法可行:
(Integer)(int)input.charAt(i);
不同之处在于,当参数为int
时,(Integer)
框整数。它实际上并不是演员,即使它看起来像。但如果参数是char
,那么它将是一次投射尝试;但是原始元素不能转换为对象,因此它不起作用。你可以做的是首先将char
转换为int
- 这个演员阵容没问题,因为两者都是原始类型 - 然后int
可以装箱。
当然,char
- > Integer
拳击可以已经成功。 “为什么不?”是一个很好的问题。可能没有什么用于这样的功能,特别是当通过稍微更明确地实现相同的功能时。 (char
- > Long
也应该工作吗?char
- > Short
?字符是16位,所以这将是最直接的。)< / p>
回答编辑:包装类的优点是包装的基元可以像对象一样对待:例如,存储在List<Integer>
中。 List<int>
不起作用,因为int
不是对象。那么也许更相关的问题是,在OO语言中做什么是原始的非对象?答案在于性能:原语更快,内存更少。用例确定对象的方便性或基元的性能是否更重要。
答案 1 :(得分:2)
因为整数是Object
。和char不是。你不能将非Object的东西投射到某个Object上。
事实上,您不能将某些Object强制转换为不在该Object层次结构中的任何其他类Object。
例如你不能这样做
Integer g = (Integer) s;
其中s
是String
的对象。
现在为什么聊天到int工作,因为每个字符在java中都表示为unicode,所以你可以把它想象成在后端char是一个较小的int版本。 (int是32位,char是16位)