0

次のような「テンプレート化された」ゲッターを作成できるかどうか疑問に思いました。

class TestGet
{
    private static Map<String,Object> theMap.....

    public static getObject<T>(String key).....

そして、コードのどこかで、次のようなものがあります。

JButton myButton = TestGet.getObject<JButton>("theButton");

注意:これは単なる「アイドル」の質問です。コードで「ダーティ」なキャストを避けるようにしています。キャストを見るたびに目が出血するからです。

それを行うにはもっとエレガントな方法があることを私は知っていますが、他のクラスとのリンクを避けるために、実際にはのマップを使用してそれを行います。

いくつかの構成を試しましたが、やりたいことには何も合わないようです...そのようなテンプレートは可能ですか?

4

2 に答える 2

4

あなたは書ける

 public static <T> T getObject(String key) {
     return (T) theMap.get(key); // produces a warning.
 }

 JButton myButton = TestGet.<JButton>getObject("theButton");

あるいは単に

 JButton myButton = TestGet.getObject("theButton");

より複雑な例については;)

class A<T> {
    class B<S> {
        public <U extends S> U tsu() {
            return null;
        }
    }
}

List<String> list = new A<Integer>().new B<List>().<List<String>>tsu();
于 2012-11-07T11:49:11.643 に答える
1

キャストを隠すだけなら、ピーターが示したように簡単です。ClassCastExceptionsも回避したい場合は、型消去により、クラスをパラメーターとして渡す必要があります(instanceofジェネリック型では実行できません)。少し面倒です。

class TestGet {
    private static final Map<String,Object> theMap = new HashMap<String, Object>();

    @SuppressWarnings("unchecked")
    public static <T> T getObject(final String key, final Class<T> clazz) {
        final Object o = theMap.get(key);
        return o != null && clazz.isAssignableFrom(o.getClass())
               ? (T) o
               : null;
    }
}

その後

JButton b = TestGet.getObject("theButton", JButton.class);
于 2012-11-07T12:00:03.907 に答える