java 容器 基本类型_在Java的容器类中为什么不能存放基本类型?

首先, 问题应该问的是Java的泛型容器类不能存放基本类型. 因为我可以把一个int数组包装成一个int容器类, 这样就可以存放int这个基本类型了.

Java的泛型容器只能存放对象(基于Object的对象), 在泛型出现之前也是存放Object的容器, 也就保证了这种泛型很容易兼容之前的代码, 当然代价就是这种泛型只能用于编译时, 运行时几乎没有区别, 给开发和优化运行时降低了不少工作量.

不过原因并不只是兼容性和运行时的复杂度, 还有一个影响不小的因素就是接口的规范性. 想想泛型如果支持了基本类型, 接口定义会有什么问题呢? 比如Map容器最常用的"V get(K key);"接口方法, 如果容器中找不到指定的key, 应该返回什么呢? 当然返回一个兼容V类型但又不是V类型的结果比较好, 这在基于Object的类型中很容易找到null这个符合条件的结果. 如果V是int呢,抛异常? 这会破坏接口的规范性. 而且很多开发者会不满抛异常的做法, 因为会遇到经常get一个找不到key的情况发生, 总抛异常不但代码写起来麻烦, 性能也有很大影响. 这就需要换个get接口设计, 比如返回boolean表示是否找到, 但如果找到的话结果又怎么返回呢, 这又涉及JVM缺乏参数的引用传递及多返回值的特性.

总的来说, 让泛型支持基本类型不是一件简单的事, 这需要对Java语言做出很多关联性的改动, 而且同时需要JVM增加不少相关特性的增强. 而从这些年Java的特性历程来看, JVM的基本部分早在最初的1.0就确定下来了, 后续版本改动都不大. JDK5的泛型加入几乎没让JVM改动分毫,而是在并发的内存安全上做了增强; JDK7只加了一条invokedynamic指令就算是这25年屈指可数的大改动之一了. JVM的发展几乎都在JIT和GC的优化上, 而基本部分根本不敢做大改动, Java语言的语法改进也就受到不少限制, 这些年的语法增强绝大多数都只是编译层的.

说到这里应该能看出来, Java体系是偏保守的, 本质的部分(JVM标准)很难撼动, 当然从宏观来看这也并不完全是缺点, 稳定的核心也会带来稳步发展的生态, 以及对历史积累出来的优秀项目的尊重, 也让初学者更容易上手, 符合编程门槛应该越来越低的未来趋势.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值