前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员的职业素养真是完全靠不住的东西

程序员的职业素养真是完全靠不住的东西

作者头像
大神带我来搬砖
发布2018-08-02 15:19:16
2010
发布2018-08-02 15:19:16
举报

事情要从一次面试说起,面试官问了这么一个问题,在JDK下面这个方法中:

代码语言:javascript
复制
public static <T extends Comparable<? super T>> void sort(List<T> list) 

这里面<T extends Comparable<? super T>>有什么用?

很明显,sort方法是要对一个List排序,这个List中的元素类型为T,<T extends Comparable<? super T>>是对T进行了约束,要求T必须是一个实现了Comparable接口的类型。那么为什么不是<T extends Comparable<T>>和<T extends Comparable<?>>呢?

如果写成了<T extends Comparable<?>>,那么T的类型就过于宽泛。下面这个类会被认为是合法的类型,但实际上这个类实现的comparable接口全无意义可言,一个类型怎么会和一个和它毫无关系的类型做比较呢?

代码语言:javascript
复制
public class Bar implements Comparable<String>

如果写成了<T extends Comparable<T>>,那么T的类型就过于严格。因为实际中有可能是T继承了类型S,S实现了Comparable<S>,这样T实际上是实现了Comparable<S>。那么对T类型排序的时候,可以借助于Comparable<S>的实现进行。

<T extends Comparable<? super T>>在一定程度上解决了以上两个问题,但也不是十全十美,比如下面这个类

代码语言:javascript
复制
public class Bar extends RuntimeException implements Comparable<Exception>

这个Comparable实现的也是莫名其妙,因为理论上x.compareTo(y)和y.compareTo(x)的符号应该相反才对,可是Exception根本没有compareTo方法。但是这个类也能通过sort方法的检查。

归根结底,还是Comparable这个接口的约束力太弱,理论上实现了Comparable接口的对象,只能和相同类型的对象进行比较。但是就像equals和hashcode的代码契约一样,现在编译器在语法层面完全无法提供检查,只能靠程序员的职业素养来产生良好的代码,真是太不开心了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档