[英]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();
請注意,返回的Listener
和MyListener
不是兼容類型。
我要補充一點,您的接口實際上是一個功能接口,因為它聲明了一個抽象實例方法。
使用泛型方法不允許將函數接口與lambdas主體一起使用,而只能與方法引用一起使用。
例如,這些無法編譯:
Listener<String, Integer> invalidListener = () -> new MyListener<String, Integer>();
Listener<String, Integer> invalidListener2 = () -> new MyListener<>();
而方法參考將編譯:
Listener<String, Integer> validListener = MyListener::new;
這是方法特定的參數化類型,但是...接口中已經定義了T
和R
參數,因此應避免這種情況,因為它從接口隱藏了已定義的參數。
正確的用法示例是接口僅定義參數R
:
public interface Listener<R> {
<T> Listener<R> get(T t);
}
但是,即使這種用法也值得懷疑。 這個例子很清楚-接口使用參數R
並且僅其方法另外使用T
沒有<T>
特征的另一種方法將無法使用T
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.