0

タイプ T を取るパラメーター化された汎用クラス X があります。その条件 (T の拡張/実装など) は定義されていません。

class X <T> {
    Map<T, String> map = new HashMap<T, String>();

    public void put() {
        map.put((T)getLong(), "");
    }

    public long getLong() {
        return 0L;
    }
}

T は間違いなくオブジェクト型であり、プリミティブではないことがわかっています。したがって、返された「長い」値が Long に Autoboxed され、その後 T へのキャストが続くことを期待していますが、それは起こりません。

コンパイラは、「long から T にキャストできません」と言っています。パラメータ化された型 T を "Long" に置き換えれば問題ありません。パラメータ化された型が関係しているときにJavaがプリミティブ型のオートボクシングをサポートしない理由を誰でも説明できますか? 私が欠けているものはありますか?

ありがとう!

4

1 に答える 1

2

私は、最初にオートボックスしてから T にキャストする必要があると思います。次のように記述する必要があります。

public Long getLong() {  //not long, because it's primitive
        return 0L;
    }

したがって、このメソッドが戻るとオートボクシングが発生します。あなたの場合、それは長いプリミティブをオートボックス化せず、この長いプリミティブを T にキャストしようとしていますが、それは単にできません。

于 2012-06-25T06:47:02.393 に答える