簡體   English   中英

Java Generic方法 - extends關鍵字的用法是什么?

[英]Java Generic method - what's the usage of extends keyword?

我不明白這兩個代碼片段之間的區別。

在第一個例子中, T extends List的作用是什么? 我可以把它解釋為“一個命名的方法see ,你可以通過List型或亞型的List ,以”? 如果是,為什么不使用方法2?

1。

public <T extends List> void see(T n) {}

2。

public void see(List n) {}

在這個例子中,我認為它沒有用。

但在這一個:

public <T extends MyClass> T[] toArray(List<T> n) {
   ...
}

它為您提供了一些類型檢查(我在返回類型中重用了T )。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
//I gave a List<Integer> so it returns a Integer[]. No need to cast ! 
Integer[] myArray = toArray(list);

在這種情況下:

//I don't know the generic type of the list so I return a Object[]
public Object[] toArray(List n) {
   ...
}

您需要投射結果。

注意:要回答您的問題,這里<T extends MyClass>僅將T的類型限制為MyClass的子類。

通常使用“有界泛型類型”,以允許類中的方法/或方法的參數類型或返回類型相互關聯。

考慮你的例子1):

public <T extends List> void see(T n) {}

泛型類型被限制為List的子類型,因此在JVM級別,編譯的(原始)代碼和簽名將等同於示例2)。

然而,編譯器如何處理“通用”和“原始”類型存在一些細微的語義差異。 “原始”和“通用”類型之間的轉換通常是警告,未經檢查的泛型類型操作也是如此。

對於使用泛型的代碼,聲明List(我理解)會更好。 由於方法參數之間沒有相互關系,第二種方式會更簡單。

我的建議:

public void see (List<?> items) {}

1)中的樣式對於相互關聯的參數/或結果類型更有意義。 幾個單獨的示例,顯示了更典型的用法:

public <T>  List<T> getChildren (T parent);
public <T>  List<T> listItems (T list1, T item2);
public <T extends List<?>>  T combineLists (T list1, T list2);

將T聲明為項參數並對其進行泛化,可能更常見,而不是將T聲明為“集合類型”。

暫無
暫無

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

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