Java泛型:声明泛型类型的映射值

时间:2012-06-13 10:30:16

标签: java generics casting

我是仿制药的新手。

拥有Map之类的

private static Map<String, Object> map;

和像

这样的方法
public <T> T getObject(final Class<T> myClass) {
    return (T)map.get(myClass);
}

如何更改地图声明,以便在从方法返回时不必进行强制转换?

3 个答案:

答案 0 :(得分:8)

您需要创建泛型类,而不是通用方法:

public class MyClass<T> {
   private Map<String, T> map;

   public T getObject(final String key) {
    return map.get(key);
   }
}

另外,我将参数从Class更改为String。如果map.get()需要一个String,那么传递一个Class是没有意义的。

编辑:我没注意到地图是静态的。如果您可以将其更改为非静态而不破坏程序的其他部分,则可以使用。如果你做不到,那么就无法避免演员。

答案 1 :(得分:0)

由于get()方法返回Object,因此无法避免强制转换操作 有关详细信息,请参阅here

答案 2 :(得分:0)

如果您愿意放弃地图的static修饰符,那么您可以这样做:

public class MyClass<T> {

    private Map<String, T> map;

    public T getObject(final Class<T> myClass) {
        return map.get(myClass);
    }
}

否则:

  

引用泛型的类型参数是编译时错误   C级中的C级:

     
      
  • C
  • 的静态成员的声明   

(摘自JLS),这会阻止您使用参数化类来实现上述目标。

尝试做的是指从另一个成员(也恰好是静态的)引用参数化的方法的类型参数,也无法到达。