簡體   English   中英

處理通用方法中的特定類型采用並返回相同的通用類型

[英]Handle specific types in a generic method takes and returns the same generic type

我有一個通用方法T foo(T) ,它根據參數的實際類型執行不同的操作。 以下是說明相同問題的示例。 (有關我在代碼中實際執行的操作的說明,請參見下文。)

<T extends Number> T foo(T a) {
    if (a instanceof Integer) {
        return ((Integer) a) + 1;
    } else if (a instanceof Double) {
        return ((Double) a) + 1;
    } else {
        throw new IllegalArgumentException();
    }
}

這不違反返回類型的要求,但是javac不接受它。 問題是例如return ((Integer) a) + 1; 僅當TInteger時才執行,但編譯器無法(根據JLS)推斷出此結果,因此期望將T傳遞給return 那里的表達式類型為int ,不能轉換為T

有沒有一種方法可以解決這種情況而無需采取不受約束的演員表?


我在代碼中實際上正在做什么:在應用程序中,有一個通用接口用於封裝一些值。 該接口針對不同的值類型有不同的專門實現,而我嘗試編寫的方法應動態選擇正確的實現。

如果您在運行時對a進行類型檢查,那么您將擊敗泛型。 但是泛型無論如何都不能與數學運算符一起使用,因為這些運算符與基元一起使用,而類型參數與引用類型一起使用。 您的解決方法不適用於編譯器,因為T在編譯時可以是任何Number類型,因此當編譯器認為它可能是任何Number類型時,不允許它返回Integer

取而代之的是,我將重載兩個非泛型的foo方法-一個使用int ,另一個使用double 這些方法都不是通用的,每個方法都只會執行自己的操作。

這不是泛型的正確使用。 您應該使用方法重載

暫無
暫無

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

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