2012-06-13 94 views
1

我是泛型的新手。Java泛型:声明泛型类型的映射值

有一个Map

private static Map<String, Object> map; 

和像

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

的方法如何改变,以地图的声明从方法返回时没有做演员?

+0

你有没有机会宣布地图像'Map >'? – nobeh

+0

@nobeh IDE说:T无法解析为类型 –

+0

我认为@Pablo对此有一个很好的答案。 – nobeh

回答

8

你需要做一个通用类,而不是一个通用的方法:

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

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

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

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

+0

无法对非静态类型T做出静态引用T –

+0

@DisplayName OK,map是静态的,我错过了。然后,如果您无法将地图从静态更改为非静态,则这不起作用。 – Pablo

0

你无法回避的转换操作为get()方法返回Object 看到here更多信息

+1

除非你可以以某种方式声明该地图为类型为的地图,它似乎不适合你的示例 – Miquel

+0

@Miquel即使这样也不会改变问题,get()方法返回一个对象,而不是T – Grimmy

+0

@Miquel我尝试过,但不起作用。你能告诉我为什么吗? –

0

如果你愿意放弃你的地图的static修改,比你能做到像这样:

public class MyClass<T> { 

    private Map<String, T> map; 

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

否则:

这是一个编译时错误指一个通用的 类C的一个类型参数中的任何位置:

  • 的ç
  • 01的静态成员的声明

(摘自JLS),其阻止您使用参数化类实现上述。

什么试图做,但是,从另一个成员(这恰好也是静态的),这也可达指一个参数方法的类型参数。