可能重复:
获取java.util.List的泛型类型
我有一个Map,我想从该Map的实例中获取T的类型.我怎样才能做到这一点?
例如,我想做的事情如下:
Map<String, Double> map = new HashMap<String, Double>();
...
String vtype = map.getValueType().getClass().getName(); //I want to get Double here
Run Code Online (Sandbox Code Playgroud)
当然,API中没有这样的'getValueType()'函数.
Rob*_*ska 14
如果您Map
是声明的字段,则可以执行以下操作:
import java.lang.reflect.*;
import java.util.*;
public class Generic {
private Map<String, Number> map = new HashMap<String, Number>();
public static void main(String[] args) {
try {
ParameterizedType pt = (ParameterizedType)Generic.class.getDeclaredField("map").getGenericType();
for(Type type : pt.getActualTypeArguments()) {
System.out.println(type.toString());
}
} catch(NoSuchFieldException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将打印:
class java.lang.String
class java.lang.Number
Run Code Online (Sandbox Code Playgroud)
但是,如果您只是有一个实例Map
,例如,如果它被传递给方法,那么您当时无法获取信息:
public static void getType(Map<String, Number> erased) {
// cannot get the generic type information directly off the "erased" parameter here
}
Run Code Online (Sandbox Code Playgroud)
您可以获取方法签名(再次使用反射,如上面的示例)来确定类型erased
,但它并没有真正让你到任何地方(见下面的编辑).
编辑:
应该注意下面的BalusC的评论.你真的不应该这样做; 你已经宣布了Map的类型,所以你没有得到比现有更多的信息.在这里看到他的答案.
归档时间: |
|
查看次数: |
26178 次 |
最近记录: |