5

我是仿制药的新手。

有一个Map喜欢

private static Map<String, Object> map;

和类似的方法

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

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

4

3 回答 3

9

您需要创建一个泛型类,而不是泛型方法:

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

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

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

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

于 2012-06-13T10:35:18.460 回答
0

您无法避免强制转换操作,因为 get() 方法返回 Object 请参阅此处了解更多信息

于 2012-06-13T10:32:32.330 回答
0

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

public class MyClass<T> {

    private Map<String, T> map;

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

否则:

在以下任何地方引用泛型类 C 的类型参数是编译时错误:

  • C 的静态成员的声明

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

但是,您尝试做的是从另一个成员(碰巧也是静态的)引用参数化方法的类型参数,这也是无法访问的。

于 2012-06-13T10:45:49.577 回答