簡體   English   中英

Java通用運算結果類型

[英]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()的結果取決於類型TU則可以執行以下操作:

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 × StringString ):

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.

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