簡體   English   中英

Java 中具有可比接口的類型邊界

[英]Type Bounds with Comparable Interface in Java

在 JDK 11 中,我創建了一個名為“Collection”的泛型類,以便為類型參數提供的任何類型都必須實現 Comparable 接口。 類聲明目前如下:

public class Collection <T extends Comparable<T>> 

本來我認為類聲明應該是這樣的:

public class Collection <T implements Comparable<T>> 

但 JDK 不喜歡那樣。

所以我的問題是為什么類聲明是前者而不是后者。 我們不擴展類並實現接口嗎?

關於邊界聲明的語法,在 Java 5 中添加泛型的語言架構師面臨以下選擇:

  • 鏡像聲明結構(具有單獨的extendsimplements邊界),或
  • 為上界類型選擇一種形式(例如, T extends FooT <: Foo等)

后者(明智地,IMO)被視為更務實的選擇,因為在聲明類型變量時,超類型是類還是接口並不重要,並且具有要求客戶使用的繁瑣語法完全正確的關鍵字(並且會使復合邊界像<T extends ArrayList implements Serializable > 更加丑陋)可能會被視為只是使事情變得更難使用,而對代碼的編寫者或讀者都沒有實際好處。

這種決定通常是隨着語言的發展而發生的,在這種情況下,嚴格遵守先例只會使事情變得更加困難,沒有任何好處,因此語言設計者有時(在仔細考慮了兩種選擇的利弊后)選擇打破先例為了更好的結果。

  1. 集合已經在java.util 用這個名字創建另一個類會讓每個人都感到困惑; 我建議你選擇別的東西。

  2. 泛型通常是關於類型的。 使用了extends一詞,這有點反映了該關鍵字的相同用法,例如class Foo extends Bar ,但它的含義並不完全相同。 關鍵是,規范說它是extends而不是implements不管后面是什么,並且在這個問題上比“規范說的”更進一步沒有多大意義。

因此,鑒於E可能是一個類或一個接口,您是想要implements E還是extends E 除非您想要第三個關鍵字(可能與上下文相關),否則區分是沒有意義的。

暫無
暫無

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

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