簡體   English   中英

方法中的通用聲明

[英]Generic declaration in method

在以下代碼示例中,恰好在get方法的返回類型之前的泛型類型聲明<T>是什么意思?

public interface Listener<T, R> {
    <T> Listener<T, R> get();
}

我在Listener的類聲明中理解了它的含義,但沒有找到以這種方式使用<T>的實際示例。

它是方法范圍內的參數化類型。 它僅在get()方法的范圍內定義,並且隱藏了在Listener類中聲明的T
隱藏類型是要避免的事情,在泛型類中定義方法范圍的參數化類型通常是有問題的。

我想知道該參數在那個地方的作用。

這里T是由該方法的客戶端推斷出的類型。
但是由於此T與類中聲明的T不同,因此它可以是不同的類型。
如果要將泛型類的T轉換為客戶端指定的另一種類型,則可能有意義。 例如,假設實現:

public class MyListener implements Listener<String, Integer>{

    @Override
    public <T> Listener<T, Integer> get() {
        return convert to T and return a new instance of Listener...;
    }

}

所以你可以這樣寫:

MyListener myListener = new MyListener();
Listener<Float, Integer> listener = myListener.get();

請注意,返回的ListenerMyListener不是兼容類型。


我要補充一點,您的接口實際上是一個功能接口,因為它聲明了一個抽象實例方法。
使用泛型方法不允許將函數接口與lambdas主體一起使用,而只能與方法引用一起使用。

例如,這些無法編譯:

Listener<String, Integer> invalidListener = () -> new MyListener<String, Integer>();
Listener<String, Integer> invalidListener2 = () -> new MyListener<>();

而方法參考將編譯:

Listener<String, Integer> validListener = MyListener::new;

這是方法特定的參數化類型,但是...接口中已經定義了TR參數,因此應避免這種情況,因為它從接口隱藏了已定義的參數。

正確的用法示例是接口僅定義參數R

public interface Listener<R> {
    <T> Listener<R> get(T t);
}

但是,即使這種用法也值得懷疑。 這個例子很清楚-接口使用參數R並且僅其方法另外使用T 沒有<T>特征的另一種方法將無法使用T

暫無
暫無

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

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