我有下一个代码:
class iCache<K,V> implements Map<Object, Object>
{
...//Code
}
如何获得K和V的班级名称?
答案 0 :(得分:7)
你不能,编译器在编译时执行类型擦除。换句话说,K和V类型参数纯粹是编译时的概念,它们在运行时无法访问。
您可以做的是在运行时获取自定义Map类型中键/值的类。
答案 1 :(得分:5)
你做不到。 Java泛型不起作用。在运行时,没有可用的特定于类的信息(这称为erasure
)。如果你真的需要这些信息,你必须通过例如Class
个对象。
答案 2 :(得分:3)
如果扩展iCache
并希望获得用于声明子类的typer参数(如下所示):
class someCache extends iCache<Integer,Long> {
//...
}
您可以使用以下(source)在运行时找到这些参数:
Class clazz = ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
如果你提供像这样实例化的参数
iCache<Integer,Long> cache = new iCache<Integer,Long>();
然后你运气不好(more info)。
答案 3 :(得分:2)
这些类型将被删除。将Class和Class作为args传递到构造函数中以传递原始类型。存储为字段。注意:你的patameterisation无论如何都是坏的:你也需要将K和V传递给Map,否则你会给自己带来更大的痛苦。
答案 4 :(得分:0)
实际上你可以在键和值上调用getClass()方法