![]() |
1
7
您无法从实例中获取它,因为在Java泛型中,类型参数仅在编译时可用,而在运行时不可用。 中提供了更正式的定义 JLS. |
![]() |
2
15
如果
但是,如果您只是拥有
能够
编辑: 巴卢斯克的评论如下。你真的不需要这样做; 你 已经声明了映射的类型,因此您不会得到比现有更多的信息。看看他的 answer here |
![]() |
3
2
虽然已经给出了正确的答案,但还有一个选择尚未指出。基本上,字段和方法并不是泛型类型信息可以存在的唯一地方:超类声明也有这些信息。
然后可以通过调用“getGenericSuperclass”(on)找出所使用的泛型类型参数实例.getClass()'),然后访问指定的实际类型参数。它确实非常复杂,因为必须遍历类型层次结构以确保参数正确地绑定到映射(可能是别名等),但这是可以做到的。这就是“超级令牌”用来传递泛型声明的方式,比如:
许多Java框架(Jersey、Guice、Jackson等)都使用它 这里的问题是,尽管这确实允许确定实例的标称类型,但它仅在泛型类型的实际非泛型子类存在时才起作用,而且我不知道如何强制执行此要求(调用代码可能会发现奇怪的是,它必须为此创建一个有点虚假的Map子类)。 |