首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java反射和泛型-参数化类型信息缺失“扩展”

Java反射和泛型-参数化类型信息缺失“扩展”
EN

Stack Overflow用户
提问于 2016-02-05 21:17:04
回答 1查看 216关注 0票数 1

我想在Java 8中使用反射重新构造方法的签名,我遇到了一些泛型方法的问题。特别是,我没有发现任何有助于恢复模板类型声明中的“扩展”或“超级”情况的信息。

下面是一个基于已知源代码的特定测试用例:

从源代码中对方法进行签名:

public static <T extends AssertDelegateTarget> T assertThat(T assertion)

首先,是否有一种不需要解析字符串就可以重构<T extends AssertDelegateTarget> 部件的优雅方法?

以下是我通过反思获得的主要信息:

  • method.toString()public static org.assertj.core.api.AssertDelegateTarget org.assertj.core.api.Assertions.assertThat(org.assertj.core.api.AssertDelegateTarget)
  • method.toGenericString()public static <T> T org.assertj.core.api.Assertions.assertThat(T) “扩展AssertDelegateTarget”发生了什么?
  • method.getReturnType.toString()interface org.assertj.core.api.AssertDelegateTarget
  • method.getGenericParameterTypes()[0].getTypeName()T

基于上述反射信息的,我可以假设T和AssertDelegateTarget之间的关系,但是如何知道它是“扩展”还是“超级”呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-05 21:34:33

您已经拥有了Method对象。从这里开始,获取使用 method在方法上声明的类型参数,后者返回一个TypeVariable<Method>[]。这是在方法上声明的类型参数的数组。在这种情况下,它只有一个类型参数,因此返回的数组只有一个元素。

interface有一个检索名称TgetName的方法和一个检索边界getBounds的方法。getBounds方法返回一个Type[]。您可以确保这里的任何界都是上界,因为类型变量的声明不允许使用super,只允许使用extends

在本例中,Type变量只是AssertDelegateTargetClass对象。

现在,您可以根据上述信息重新构造"<T extends AssertDelegateTarget>"字符串。只有在Type[]非空的情况下才使用“扩展”。如果有多个边界,您将在它们之间放置一个逗号,例如T extends Bound1, Bound2

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35233683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档