Java那些事:泛型(三)

2014-11-23 23:26:23 · 作者: · 浏览: 3
ss GenericTest { /** * 这个泛型类中的泛型需要执行某些方法,但是必须 是实现了testInterface接口 * * @param t */ static void doIt(T t) { // //一旦T确定了,那么编译器便可以确定在类中或者方法中使用的类型的内部一致性 // //换句话说,就是这个类所有的T都被编译前替换了 System.out.println("Dobefore!"); t.doSomething(); System.out.println("Doafter!"); } }

7.类型系统

在Java中,大家比较熟悉的是通过继承机制而产生的类型体系结构。比如String继承

自Object。根据Liskov替换原则,子类是可以替换父类的。当需要Object类的引用的

时候,如果传入一个String对象是没有任何问题的。但是反过来的话,即用父类的引

用替换子类引用的时候,就需要进行强制类型转换。编译器并不能保证运行时刻这

种转换一定是合法的。这种自动的子类替换父类的类型转换机制,对于数组也是适

用的。String[]可以替换Object[]。但是泛型的引入,对于这个类型系统产生了一定的

影响。正如前面提到的List 是不能替换掉List 的。

引入泛型之后的类型系统增加了两个维度:一个是类型参数自身的继承体系结构,

另外一个是泛型类或接口自身的继承体系结构。第一个指的是对于 List

List这样的情况,类型参数String是继承自Object 的。而第二种指的是 List

接口继承自Collection 接口。对于这个类型系统,有如下的一些规则:

1.相同类型 参数的泛型类的关系取决于泛型类自身的继承体系结构。即

List 是Collection 的子类型, List 可以替换

Collection 。这种情况也适用于带有上下界的类型声明。

2.当泛型类的类型声明中使用了通配符的时候,其子类型可以在两个维度上分别

展开。如对Collection 来说,其子类型可以在Collection 这个

维度上展开,即List 和Set 等;也可以在

Number 这个层次上展开,即Collection 和Collection 等。如此

循环下去,ArrayList 和HashSet 等也都算是Collection

Number>的子类型。

3.如果泛型类中包含多个类型参数,则对于每个类型参数分别应用上面的规则。

理解了上面的规则之后,就可以很容易的修正实例分析中给出的代码了。只需要把

List改成List 即可。List 是List 的子类型,因此传递参数时不会

发生错误。

注:上面这一点引用自《java深度历险》

8.闲话

Java的泛型已经是Java本身不可分割的一部分了,就像其异常,在未来改动的可能性十分的渺茫,在历史问题上面编写代码更多的时候需要更多的思考,Java的泛型在JDK中的主要应用就是集合框架,而事实证明集合框架确实不错,虽然Java中的泛型没有想象的那么强大。所以,泛型与异常一样,如何写出优雅的泛型是值得追求的艺术。

<script type="text/java script">
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
上一篇: Nhibernate 一对一关系映射(主键映射)
下一篇: 最后一页
相关文章
<script type="text/java script">BAIDU_CLB_fillSlot("182716");
<script type="text/java script">BAIDU_CLB_fillSlot("517916");
图文推荐
<iframe src="http://www.2cto.com/uapi.php tid=292521&catid=85&title=SmF2YcTH0KnKwqO6t7rQzQ==&forward=http://www.2cto.com/kf/201404/292521.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
<script type="text/java script">BAIDU_CLB_fillSlot("771057");
排行
热门
<script type="text/java script">BAIDU_CLB_fillSlot("406189");
<script type="text/java script">BAIDU_CLB_fillSlot("703749");
<iframe frameborder="0" name="Iframe1" src="http://www.2cto.com/bbsdy/index.html" width="100%" height="200"> 您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
<script type="text/java script">BAIDU_CLB_fillSlot("182692");
文章
下载
读书
<script type="text/java script">BAIDU_CLB_fillSlot("771043");
<script type="text/java script"> <script language="java script" src="http://www.2cto.com/api.php op=count&id=292521&modelid=1"> <script type="text/java script">BAIDU_CLB_fillSlot("137946");
<script type="text/java script">BAIDU_CLB_fillSlot("333829");

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站<script type="text/java script"> var _bdhmProtocol = (("https:" == document.location.protocol) " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F1898984a3d796e86ad73ad1f4bc9f240' type='text/java script'%3E%3C/script%3E"));