2

Java Generics に問題があり、取得したいものが可能かどうかさえわかりません。基本的にはタイトルがすべてですが、例を挙げましょう。現在、私は次のようなものを持っています:

private static Map<Class<? extends Exception>, ExceptionTranslator<?>> MAP;

これは次のように使用されています。

MAP.put(SomeException.class, new ExceptionTranslator<SomeException>());

しかし、キーとして渡される例外タイプのトランスレーターを強制したいと思います。これは、メソッドで行うことと似ています。

<T extends Exception> Map<Class<T>, ExceptionTranslator<T>> MAP;

もちろん、これは正しいコードではなく、generics-foo はこれに対して十分に強力ではないと思います。Javaでも可能ですか?

4

2 に答える 2

2

なぜそれが不可能なのかを説明したいだけです。

問題は、型の安全性を保証できないことです。Map は equals/hashMap に依存しているため、コンパイラが T 型に関連してこれらのメソッドの正確性を証明することは不可能です。

Class代わりに、すべてのインスタンスに対して equals==true を返す独自のジェネリック クラスを使用する場合を想像してみてください。この場合、マップに 1 つのタイプを入れることができますが、別のタイプで抽出すると、キャスト例外が発生します。

private<E extends Number> void mp()
{
    Map<Key<E>, E> map = new HashMap<>();
    map.put(new Key<Integer>(), 42);// Yes, there is compilation error!
    // Otherwise we could do this:
    String str = map.get(new Key<String>());// cast exception!
}

class Key<T>
{
    @Override
    public int hashCode()
    {
        return 0;
    }

    @Override
    public boolean equals(final Object obj)
    {
        return obj instanceof Key;
    }
}
于 2013-08-09T23:15:45.700 に答える