我是新手,对泛型还不熟悉。
有一个类似于 Map
的东西
private static Map<String, Object> map;
并且像这样的一种方法
public <T> T getObject(final Class<T> myClass) {
return (T)map.get(myClass);
}
如何更改地图声明,以便在从方法返回时不必进行转换?
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就没有意义。
编辑:我没有注意到map是静态的。如果可以将其更改为非静态而不会破坏程序的其他部分,则可以使用此方法。如果不能,则无法避免转换。
由于get()方法返回Object类型,您无法避免强制转换,请参见这里获取更多信息。
Map.get()
返回一个类型为 V
的对象,即其值的通用类型(毫不意外)- javadocs。你可能会想到的是,get
方法的参数总是一个 Object
而不是 K
? - Andrzej Doylestatic
修饰符,那么你可以这样做:public class MyClass<T> {
private Map<String, T> map;
public T getObject(final Class<T> myClass) {
return map.get(myClass);
}
}
否则:
在泛型类C的任何地方引用类型参数都会导致编译时错误,包括:
- C的静态成员声明
这是从JLS中摘录的内容,它防止您使用参数化类来实现上述功能。
然而,您试图做的是从另一个成员(也是静态成员)引用参数化方法的类型参数,这也是无法访问的。
Map<String, Class<T>>
这样的映射表? - nobeh