首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否应该将其与另一种类型进行比较?

是否应该将其与另一种类型进行比较?
EN

Stack Overflow用户
提问于 2016-01-05 10:43:34
回答 1查看 578关注 0票数 17

我想知道以下内容是否有有效的用例:

代码语言:javascript
复制
class Base {}

class A implements Comparable<Base> {
    //...
}

接受T类型的集合似乎是一种常见的模式(有关示例,请参阅Collections ),其中T extends Comparable<? super T>

但是,在与基类进行比较时,在技术上似乎不可能实现compareTo()的契约,因为没有办法确保另一个类不会通过矛盾的比较来扩展基类。考虑以下示例:

代码语言:javascript
复制
class Base {
    final int foo;
    Base(int foo) {
        this.foo = foo;
    }
}

class A extends Base implements Comparable<Base> {
    A(int foo) {
        super(foo);
    }
    public int compareTo(Base that) {
        return Integer.compare(this.foo, that.foo); // sort by foo ascending
    }
}

class B extends Base implements Comparable<Base> {
    B(int foo) {
        super(foo);
    }
    public int compareTo(Base that) {
        return -Integer.compare(this.foo, that.foo); // sort by foo descending
    }
}

我们有两个使用不遵循通用规则的比较来扩展Base的类(如果有通用规则,它几乎肯定会在Base中实现)。然而,以下损坏的排序将被编译:

代码语言:javascript
复制
Collections.sort(Arrays.asList(new A(0), new B(1)));

只接受T extends Comparable<T>不是更安全吗?或者,是否有一些用例可以验证通配符?

EN

回答 1

Stack Overflow用户

发布于 2016-01-14 09:43:56

约束条件

代码语言:javascript
复制
    T extends Comparable<? super T>

应该理解为

代码语言:javascript
复制
    T extends S, S extends Comparable<S>

Comparable类型总是自比较的。

如果为X <: Comparable<Y>,则X <: Y <: Comparable<Y>必须是这种情况。

我们甚至可以从compareTo()的合同中“证明”这一点。由于必须定义反向y.compareTo(x),因此Y <: Comparable<A>, X<:A必须为真。遵循同样的论点,我们有A <: Comparable<Y>。那么传递性将导致A=Y

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34603388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档