Java泛型 - 获取参数访问权限

时间:2011-02-27 18:03:16

标签: java generics

我有下一个代码:

class iCache<K,V> implements Map<Object, Object>
{
...//Code
}

如何获得K和V的班级名称?

5 个答案:

答案 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()方法