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

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

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接口全无意义可言,一个类型怎么会和一个和它毫无关系的类型做比较呢?

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>>在一定程度上解决了以上两个问题,但也不是十全十美,比如下面这个类

public class Bar extends RuntimeException implements Comparable<Exception>

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能算法

程序员必须了解的数据结构:Array、HashMap 与 List

当开发程序时,我们(通常)需要在内存中存储数据。根据操作数据方式的不同,可能会选择不同的数据结构。有很多常用的数据结构,如:Array、Map、Set、List...

1380
来自专栏前端儿

表达式求值(1)

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值...

1982
来自专栏java学习

重要通知!小编出新的Java练习题咯!!

正确答案 3月5号公布 一、选择题和问答题 1、在一个java原文件中,import, class, package语句的顺序是( )。 A. import ...

4645
来自专栏GIS讲堂

面向对象的三个基本特征

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

1933
来自专栏一“技”之长

Swift专题讲解十七——Optional链 原

        Swift中的Optional值有这样的特性,当对其进行可选拆包时,即使用?进行Optional类型值的取值时,如果Optional值不为nil...

702
来自专栏mathor

ST算法

 RMQ(Range Minimum/Maximum Query),即区间最值查询。对于长度为n的数列arr,回答若干询问Q(i,j),返回数列arr中下标在i...

2262
来自专栏趣谈编程

Unicode与UTF-8的区别

要弄清Unicode与UTF-8的关系,我们还得从他们的来源说起,下来我们从刚开始的编码说起,直到Unicode的出现,我们就会感觉到他们之间的关系

1322
来自专栏chenjx85的技术专栏

leetcode-179-Largest Number(理解规则,自定义cmp函数进行排序)

1、这道题给定一个vector,里面存放着int类型的非负整数,要求把这些非负整数拼起来,尽可能拼成一个最大的整数。

1913
来自专栏前端吧啦吧啦

涨薪必备Javascript,快点放进小口袋!

1422
来自专栏web前端教室

不学不知道,sort()方法中的坑

今天的前端零基础课,在讲到js中的sort()排序方法的时候,说sort()这个方法在给数字排序的时候,根本不是按数字大小来排序的。 它是把数字都当成字符串来看...

19210

扫码关注云+社区

领取腾讯云代金券