簡體   English   中英

通用方法語法 <Type> 方法()

[英]Generic method syntax <Type>method()

我剛剛發現在Java中可以實現以下功能:

我們有一個方法:

public <T> void doSomething( T value );

我們可以這樣稱呼它:

this.doSomething( "Hello World" );

或者我們可以用我剛剛發現的方式來稱呼它:

// Restricts the argument type to String
this.<String>doSomething( "Hello World" ); 

起初,我認為如果必須進行類比較,這會非常方便,因為我們在編譯時就知道T的類型,但是泛型不是運行時功能,因此無法使用:

public <T> void doSomething( T value ) {
    if ( field instanceof T ) ...  // Not working
}

問題:

  • 為什么和在通常的this.method( ... )語法上使用this.<Type>method( ... ) this.method( ... )語法?
  • 是否有區別(參數的編譯時類型限制除外)?

當由於某種原因無法自動推斷類型時,該語法非常方便。 有很多類似的情況。 例如,如果返回值是從泛型類型派生的,並且它是更復雜的表達式的一部分,則該類型不明顯。

例:

<T> T someMethod(T o) {
    return o;
}

Number res = (num == null) ? this.<Number>someMethod(null) : null;

如果沒有特殊語法(無法編譯),此示例將無法工作,因為無法在此表達式中推斷類型。

還要注意,可以使用類似的語法來調用靜態方法。 例如,以下代碼片段導致編譯錯誤:

Collection<Integer> getCollection() {
    return someCondition ? Collections.emptyList() : Collections.singletonList(Integer.valueOf(42));
}

因此,我們必須改為指定類型:

Collection<Integer> getCollection() {
    return someCondition ? Collections.<Integer>emptyList() : Collections.singletonList(Integer.valueOf(42));
}

關於您的第二個問題:除了明確給出的泛型類型之外,沒有其他區別。

為什么和在通常的this.method( ... )語法上使用this.<Type>method( ... ) this.method( ... )語法?

當您需要顯式提供類型參數時,可以使用前者。 如果您不這樣做,則會為您推斷類型,但這可能不是您想要的。

暫無
暫無

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

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