[英]Java generic operation result type
我不是專業的Java程序員,所以這個問題可能很簡單,但是我在網上搜索了答案,但到目前為止沒有發現任何問題。
可以說我們在Java中有一個通用類:
public class C1 <T, U> {
public /*TYPE*/ f(T t, U u) {
return t.g(u)
}
問題是-如何確定該通用示例的結果類型? 是否可以編寫類似typeof(tg(u))
?
您不能按原樣調用tg(u)
,因為T
是一個無界類型。 您需要在其上加上一個編譯時綁定,以便編譯器知道可用的方法。 否則,您將只能調用Object
方法,因為編譯器唯一可以推斷出T
的就是擴展Object
。
例如,如果您具有要調用g
方法的接口G<U>
:
public interface G<U> {
R g(U u);
}
然后,您將指定T extends G<U>
,從而可以調用g()
。 現在您知道g()
的返回類型是: R
。
public class C1<T extends G<U>, U> {
public R f(T t, U u) {
return t.g(u)
}
}
如果希望g()
的結果取決於類型T
和U
則可以執行以下操作:
public interface G<T, U> {
T g(U u);
}
public class C1<T, U> {
public T f(G<T, U> g, U u) {
return g.g(u)
}
}
您的代碼不會按原樣進行編譯,因為沒有任何東西告訴編譯器t
具有成員函數g
。 您需要將類型參數T
聲明為擴展了確實聲明了g()
方法的某些基類或接口。 返回類型將是g
的返回類型(可以是另一個參數類型)。
例如:
public interface Foo<X, Y> {
X g(Y u);
}
public class C1 <T extends Foo<X, U>, U, X> {
public X f(T t, U u) {
return t.g(u);
}
}
請注意,如果返回類型X
也是泛型的,則需要在類C1
為其聲明一個單獨的類型參數。 另外,您可以聲明C1
統一處理單個參數化類型(例如String
× String
→ String
):
public class C1 <T extends Foo<T, T>> {
public T f(T t, T u) {
return t.g(u);
}
}
其他變化也是可能的。
如果要強制t使用方法g,則必須這樣聲明類:
public class C1<T extends Ginterface, U extends SecInterface> {
}
並且此方法的返回類型將是Ginterface中g函數的返回類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.