簡體   English   中英

Java泛型:方法聲明參數中的類型擴展

[英]Java Generics: Type Extension In Method Declaration Parameters

我正在學習Java Generics。 我的理解是Generics按類型參數化集合。 在Oracle教程中,有以下注釋:

在通用代碼中,稱為通配符的問號(?)表示未知類型。

在下一頁中,下面是參數中帶有上限通配符的方法聲明示例:

public void process(List<? extends Foo> list)

鑒於此,我想知道為什么這個方法聲明是非法的:

public void process(List<E extends Number> list)

雖然這是合法的:

public <E extends Number> void process(List<E> list)

指定方法parm類型時,您使用的是泛型類型,因此必須事先定義它。 在此語句中,您使用E而無需定義

public void process(List<E extends Number> list) { /* ... */ }

但是,在第二個中,它是在方法返回類型(void)之前定義的:

public <E extends Number> void process(List<E> list) { /* ... */ }

沒有比“因為這就是語言的設計方式”更好的答案。 但是考慮它的一種方法是類型參數被視為方法的另一個參數列表:它們必須一次出現在一個(有序)列表中。

您可以通過顯式傳遞類型參數來調用泛型方法:例如, foo.<Integer, String>process(list) 這意味着類型參數必須具有顯式順序,就像普通值參數一樣。

要完成@ phoenix的回答,本聲明中的問題

public void process(List<E extends Number> list) { /* ... */ }

是你的泛型E的聲明是在錯誤的地方。 正確的地方是在返回類型之前:

public <E extends Number> void process(List<E> list) { /* ... */ }

但是,定義泛型類型的另一個可能的地方是類聲明本身:

class MyClass<E extends Number> {

    public void process(List<E> list) { /* ... */ }

}

大約兩者都是相同的,但我只使用第一個。

暫無
暫無

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

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