gpt4 book ai didi

java - Comparable 接口(interface)的声明

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:04 25 4
gpt4 key购买 nike

Comparable接口(interface)变成了通用的,声明变成了

interface Comparable<T>

真的应该是这样的
interface Comparable<T extends Comparable<T>>
T没有意义不延长 Comparable因为实现者必须确保
a.compareTo(b)


b.compareTo(a)

总是有相反的符号。

我一直认为声明“错误”的原因与泛化现有接口(interface)的问题有关,但我无法真正解释它。

有没有人有任何见解?

最佳答案

Really it should be something like

interface Comparable<T extends Comparable<T>>



但这并没有真正为您提供任何您无法通过 interface Comparable<T> 获得的东西.

你提到关于 a.compareTo(b)的事情和 b.compareTo(a) ,但请注意,您的声明( interface Comparable<T extends Comparable<T>> )实际上并不能确保如果 a.compareTo(b)是有效的,即 b.compareTo(a)编译。如 aComparable<T> , a.compareTo(b)要求 bT ,这也是 Comparable<T> , 所以 b.compareTo()需要一个 T .那并不能证明 b.compareTo(a)作品,作为 aComparable<T> .举个例子,考虑 class Foo implements Comparable<Foo> , 和 class Bar implements Comparable<Foo> .如 a类型为 Barb类型为 Foo ,然后使用您的声明 Comparable , a.compareTo(b)编译但 b.compareTo(a)不编译(这也与 Comparable 的原始声明发生的情况相同)。有一个界限来保证当 a.compareTo(b)作品,那 b.compareTo(a)也有效,你需要有类似 interface Comparable<T extends Comparable<Comparable<T>>> 的东西,但这将是一个无用的界面,因为没有人拥有 T相当于 Comparable<T> .

更根本的是,在泛型中添加边界的目的是允许您编译一些不会编译或需要强制转换的东西,而没有边界。请记住,Java 在编译时检查代码是否是类型安全的——它只允许您编译它知道使用在编译时声明的类型可能的东西(除非您添加显式强制转换,在这种情况下您负责转换的正确性)。因此,添加边界不会增加类型安全性——无论是否有边界,Java 编译器都只会编译可证明类型安全的代码(显式强制转换或原始类型转换除外)。边界的不同之处在于,通过添加约束,它允许 Java 接受更多类型安全的代码,因为约束允许 Java 推断出以前无法做到的正确性。因此,只有当它允许您编译没有边界就无法编译的东西时,才应该添加边界,或者需要在没有边界的情况下添加显式强制转换。否则,增加复杂性没有任何好处有什么意义?

在这里,您不会找到任何实际的代码用例,这些用例可以使用您的 Comparable 声明进行编译。但不会与原始声明一起编译。我见过的唯一现实用例是声明 interface Foo<T extends Foo<T>>将允许编译某些不能使用 interface Foo<T> 的东西类似于 Builder 模式,其中 Foo<T>有一个返回 T 的方法,因为我们知道 TFoo<T> 的子类型,我们可以从 Foo<T>Foo<T>并将这些操作链接起来,而无需知道 T 的具体类型.但 Comparable 并非如此。 -- Comparable没有返回 T 的方法.

如果您有一个类或方法接受它需要排序或排序的可比较类型,则它必须是一个通用方法或类,要求该类型与其自身可比较(例如 class SortedList<T extends Comparable<? super T>><T extends Comparable<? super T>> void sort(List<T>) )。 Comparable的声明中没有任何限制可以确保类型与自身具有可比性。

如果有人决定编写一个类型与完全不相关的东西(甚至不是 Comparable 的东西)可比的类,那么从类型安全的角度来看这很好。是的,您指出它可能违反了 .compareTo() 的文档。 ,但这是代码行为问题,而不是类型安全问题。他们的类可能不是很有用,因为它不能满足大多数使用 Comparable 的地方的界限。 ,这可能会具有要求类型与其自身可比的界限。如果有一个地方需要 Comparable没有要求类型与自身可比的界限,然后他们可以在那里使用他们的类,但这仍然是类型安全的,因为这个地方不需要类型与自身可比的事实意味着它自己的代码不依赖于这个事实来安全编译(或者他们使用了显式强制转换,在这种情况下他们对正确性负责)。在任何情况下,有人可能会编写一个(主要是无用的并且可能违反文档)类,该类与不可比较的类相比较不会影响您编写自己的类与自身相比较的能力,并且没有类型安全添加任何边界的原因。

关于java - Comparable 接口(interface)的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46878319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com