簡體   English   中英

Java 泛型的統一參數傳遞和類型安全

[英]Uniform parameters passing and typesafety with Java generics

因為我經常不得不處理隨機化,所以我想創建一個類來方便地將我通常需要的所有這些功能分組。 其中,我想到了一個通用的fromPool()函數,它在給定可變數量的對象的情況下,隨機返回其中一個。 當然,我必須將可變參數和泛型結合起來,我剛剛發現這可能是一個很大的禁忌,具體取決於情況(我懷疑我的就是其中之一)。 這是代碼:

abstract public class RandomGenerator {

    public static int fromRange(int min, int max) {

        return (int) (Math.random() * (max + 1 - min)) + min;
    }

    public static <T> T fromPool(T ... pool) {

        return pool[fromRange(0, pool.length - 1)];
    }
}

問題是我當然可以傳遞不同類型的fromPool()對象,從而使返回類型非常可變。 因此,例如,我可以執行以下操作:

int n = (int) RandomGenerator.fromPool("String", 6);

這將工作直到fromPool()不返回“String”,然后導致拋出此異常。

線程“main”中的異常 java.lang.ClassCastException:類 java.lang.String 無法轉換為類 java.lang.Integer(java.lang.String 和 java.lang.Integer 位於加載程序引導程序的 java.base 模塊中') 在 Test.main(Test.java:109)

這是我想知道的:

1)這是在結合泛型和可變參數時出現的“類型安全:通過可變參數參數池造成的潛在堆污染”警告嗎? 還有更多的東西嗎?

2) 有沒有辦法限制泛型效果,以便您無法將彼此不兼容的對象傳遞給同一個函數調用? 基本上是某種自動的橫向超載(我覺得我在問月亮)?

3) 實際上我以前寫過一個不那么通用的fromPool()版本,它只處理 Number 對象。

public static <N extends Number> N fromPool(N ... pool) {

    return pool[fromRange(0, pool.length - 1)];
}

與我最初認為的相反,它結束這個版本也是不安全的,因為雖然在原始類型之間進行轉換不會產生任何問題,但在各種包裝類之間進行轉換是不可能的,因此再次導致 ClassCastExceptions。 有沒有辦法調整這個版本以至少使這個版本安全?

非常感謝您的洞察力:)

您可以嘗試以下類似的方法。

RandomGenerator.<String>fromPool("String", "Something");

通過這樣做,您將為該函數調用顯式指定通用對象類型。 而且您不需要強制轉換返回值,因為顯式聲明了泛型類型。

當您不指定通用對象類型時,它將被推斷為java.lang.Object

暫無
暫無

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

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