0

我想知道是否可以创建一个“模板化”getter,例如:

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 回答