Java泛型-获得对参数的访问

Java泛型-获得对参数的访问,java,generics,Java,Generics,我有下一个代码: class iCache<K,V> implements Map<Object, Object> { ...//Code } 类iCache实现Map { …//代码 } 如何获得K和V的类名?不行,编译器在编译时执行类型擦除。换句话说,K和V类型参数纯粹是编译时的概念,它们在运行时不可访问 您可以在运行时获取自定义映射类型中的键/值类。您不能。Java泛型不是这样工作的。在运行时,没有特定于类的信息可用(这称为擦除)。如果您确实需要此信息,则必须传

我有下一个代码:

class iCache<K,V> implements Map<Object, Object>
{
...//Code
}
类iCache实现Map
{
…//代码
}

如何获得K和V的类名?

不行,编译器在编译时执行类型擦除。换句话说,K和V类型参数纯粹是编译时的概念,它们在运行时不可访问


您可以在运行时获取自定义映射类型中的键/值类。

您不能。Java泛型不是这样工作的。在运行时,没有特定于类的信息可用(这称为
擦除
)。如果您确实需要此信息,则必须传入例如
对象。

如果您扩展
iCache
并希望获得用于声明子类的打字机参数(如下所示):

如果您在实例化时提供如下参数

iCache<Integer,Long> cache = new iCache<Integer,Long>();
iCache缓存=新的iCache();

那么你就倒霉了()。

这些类型将被删除。将类和类作为参数传递到构造函数中,以传递原始类型。存储为字段。注意:无论如何,您的参数化是不好的:您也需要将K和V传递给Map,否则您会给自己带来更多的痛苦。

实际上,您可以对键和值调用getClass()方法。

值得注意的是,运行时的键/值类可能与实际参数不同(它可以是K和V的子类).我的问题是,如果我有
iCache缓存=新的iCache(20)我可以放置所有东西,比如
cache.put(0,“test”)我真的不知道如何修复它。@ExR:你需要实现
Map
,而不是
Map
Class clazz = ((ParameterizedType) getClass()
                       .getGenericSuperclass()).getActualTypeArguments()[0];
iCache<Integer,Long> cache = new iCache<Integer,Long>();