簡體   English   中英

可比接口聲明

[英]Declaration of Comparable interface

Comparable接口變得通用時,聲明就變成了

interface Comparable<T>

真的應該是這樣的

interface Comparable<T extends Comparable<T>>

T不能擴展Comparable是沒有意義的,因為實現者必須確保這一點

a.compareTo(b)

b.compareTo(a)

總是有相反的跡象。

我一直認為獲得聲明“錯誤”的原因與生成現有界面的問題有關,但我無法解釋它。

有沒有人有任何見解?

真的應該是這樣的

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)有效,因為a是一個Comparable<T> 作為一個例子,考慮class Foo implements Comparable<Foo>class Bar implements Comparable<Foo> 如果aBar類型而bFoo類型,那么使用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自身相當。

如果有人決定編寫一個類型與完全不相關的類型(甚至是不可Comparable東西)的類,那么從類型安全的角度來看這很好。 是的,您指出它可能違反.compareTo()的文檔,但這是代碼行為問題,而不是類型安全問題。 他們的類可能不會非常有用,因為它不會滿足大多數使用Comparable地方的邊界,這可能會限制要求類型與其自身相當。 如果有一個地方需要Comparable沒有綁定要求類型與自己相比,那么他們可以在那里使用他們的類,但這仍然是類型安全的,因為這個地方不需要與自身相當的類型意味着它自己的代碼不依賴於這個事實來安全地編譯(或者它們使用顯式轉換,在這種情況下它們負責正確性)。 在任何情況下,有人可能會編寫一個(大多數是無用的,可能違反文檔)類,這個類與不具有可比性的東西相比,不會影響你編寫自己的類的能力,而這個類與自身相當,而且沒有類型安全添加任何邊界的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM