Java “可比性”究竟比表面上的精确多少?

Java “可比性”究竟比表面上的精确多少?,java,Java,可比较的界面如下所示 interface Comparable<T> { public int compareTo(T other); ... } 接口 { 公共国际比较(T其他); ... } 这并不能从本质上说明Comparable的实现与T类型之间的关系。Java规范的文本似乎建议Comparable的实现应该始终是T的子类,但据我所知,它并没有明确说明这一点。应该是吗?此外,如果Comparable的实现A是T的严格子类,那么反对称规则似乎表明T对于A的某些超类Ap,

可比较的
界面如下所示

interface Comparable<T>
{
  public int compareTo(T other);
...
}
接口
{
公共国际比较(T其他);
...
}

这并不能从本质上说明
Comparable
的实现与
T
类型之间的关系。Java规范的文本似乎建议
Comparable
的实现应该始终是
T
的子类,但据我所知,它并没有明确说明这一点。应该是吗?此外,如果
Comparable
的实现
A
T
的严格子类,那么反对称规则似乎表明
T
对于
A
的某些超类
Ap
,必须是
Comparable
的实现。这是一项相当严格的要求。事实上,这已经足够严格了,除非这两个类是专门为这个目的而构建的,否则我认为通常不可能做到这一点。有什么想法吗?是我遗漏了什么,还是这是一个奇怪的接口?

这个接口早在泛型被引入之前就存在了,并且最初看起来像

public int compareTo(对象其他)

这仍然是编译成字节码后的样子。通过添加泛型,修改了该接口以提供一些基本的类型安全性

如果我没弄错你的问题,你是在问“是什么阻止了我这么做?”

class SomeClass实现了可比较的


没什么。当
compareTo
方法处理对象时,您必须考虑
compareTo
对哪些类型有用,更新后的界面仍然如此。

这个界面在引入泛型之前很久就存在了,最初看起来像

public int compareTo(对象其他)

这仍然是编译成字节码后的样子。通过添加泛型,修改了该接口以提供一些基本的类型安全性

如果我没弄错你的问题,你是在问“是什么阻止了我这么做?”

class SomeClass实现了可比较的


没什么。当
compareTo
方法处理对象时,您必须考虑
compareTo
对哪种类型有用,更新后的界面仍然如此。

是谷歌宕机还是什么?合同全是“波希米亚式”的,我已经读了好几遍了。它并没有准确地回答这个问题,因为它没有说什么时候必须提供这些比较。很明显,如果a.compareTo(b)和b.compareTo(a)都有效,那么它们一定有某种关系。但是什么时候它们才是有效的呢?我不知道问题是什么。如果您传入一个子类
T
,它与其他任何东西都是一样的;它(不向下投射)将被视为方法内部的
T
。如果您希望子类在任何情况下都不被视为相等的,那么可以执行
instanceof
检查(这在
compareTo()
实现中是非常常见的)。。。抓紧最后一点。不知什么原因,我脑子里一直想着
equals()
。同样的情况仍然适用于:
instanceOf
,但如果这是您真正想要的,您需要决定排序方式。@BrianRoach,我想我很难弄清楚让
某个类
实现
可比性
有什么用,因为规则似乎限制太多了。一种可能性是子类的实例可以与它的超类的实例进行比较,我想这是非常有效的,但这似乎相对不太可能。Java难道没有办法在接口中表示实现类型与传入的类型相同吗?是Google宕机还是什么?合同全是“波希米亚式”的,我已经读了好几遍了。它并没有准确地回答这个问题,因为它没有说什么时候必须提供这些比较。很明显,如果a.compareTo(b)和b.compareTo(a)都有效,那么它们一定有某种关系。但是什么时候它们才是有效的呢?我不知道问题是什么。如果您传入一个子类
T
,它与其他任何东西都是一样的;它(不向下投射)将被视为方法内部的
T
。如果您希望子类在任何情况下都不被视为相等的,那么可以执行
instanceof
检查(这在
compareTo()
实现中是非常常见的)。。。抓紧最后一点。不知什么原因,我脑子里一直想着
equals()
。同样的情况仍然适用于:
instanceOf
,但如果这是您真正想要的,您需要决定排序方式。@BrianRoach,我想我很难弄清楚让
某个类
实现
可比性
有什么用,因为规则似乎限制太多了。一种可能性是子类的实例可以与它的超类的实例进行比较,我想这是非常有效的,但这似乎相对不太可能。Java难道没有办法在接口中表示实现类型与传入的类型相同吗?