对象地图的对象“强制转换模板”getter?

时间:2012-11-07 11:43:29

标签: java

我想知道是否有可能创建一个“模板化”的吸气剂,例如:

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

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

代码中的某处,如:

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

注意:这是只是一个“闲置”的问题,我正试图避免代码中的“脏”演员,因为每次看到它们都会让我的眼睛流血。

我知道有更优雅的方法可以做到这一点,但我真的会用地图来避免与其他类链接。

我尝试了一些配置,但似乎没有任何东西适合我想要做的......这样的模板是否可能?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

如果你想要做的只是隐藏演员表,那么彼得就表现得很容易。如果您还想避免使用ClassCastExceptions,请键入erasure指示您必须将类作为参数传递(您不能对泛型类型执行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);