当前位置: 首页 > 面试题库 >

从通用基本接口的实例检索类型参数

嵇财
2023-03-14
问题内容

给定2个接口:

public interface BaseInterface<T> { }
public interface ExtendedInterface<T0, T1> extends BaseInterface<T0> {}

和一个具体的类:

public class MyClass implements ExtendedInterface<String, Object> { }

如何找出传递给BaseInterface接口的类型参数?

(我可以通过调用类似以下内容来检索ExtendedInterface类型参数

MyClass.class.getGenericInterfaces()[0].getActualTypeArguments()

但我无法找到一种简便的方法来递归到任何基本的通用接口并获取有意义的东西)。


问题答案:

通常,这个问题不容易完全解决。例如,如果它是一个内部类,还必须考虑包含类的类型参数,…

因为仅使用Java本身提供的内容就很难对泛型类型进行反射,所以我编写了一个完成艰苦工作的库:gentyref。请访问http://code.google.com/p/gentyref/
。例如,使用gentyref,您可以执行以下操作:

Type myType = MyClass.class;

// get the parameterized type, recursively resolving type parameters
Type baseType = GenericTypeReflector.getExactSuperType(myType, BaseInterface.class);

if (baseType instanceof Class<?>) {
    // raw class, type parameters not known
    // ...
} else {
    ParameterizedType pBaseType = (ParameterizedType)baseType;
    assert pBaseType.getRawType() == BaseInterface.class; // always true
    Type typeParameterForBaseInterface = pBaseType.getActualTypeArguments()[0];
    System.out.println(typeParameterForBaseInterface);
}


 类似资料:
  • 问题内容: 我有这个界面: 并实现该类: 在此案例中,parameter是,这是的具体实现。如何使用反射获得此效果? 问题答案: 通过通用接口解析类型。例如 PS:请记住acutalTypeArguments是type 。他们一定不是一个。在您的情况下,它是一个Class,因为您的类型定义是。

  • 考虑以下TS定义: 没什么问题,但我想知道是否有一个等效?显然,可以将泛型传递到接口中,尽管这不是我想要的,例如: 这里的示例是在React代码的上下文中,但潜在的问题是基本的TS。

  • 本文向大家介绍Mysql索引类型与基本用法实例分析,包括了Mysql索引类型与基本用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Mysql索引类型与基本用法。分享给大家供大家参考,具体如下: 索引 MySQL目前主要有以下几种索引类型: 普通索引 唯一索引 主键索引 组合索引 全文索引 - 普通索引 是最基本的索引,它没有任何限制。 - 唯一索引 与前面的普通索引类似,不同的

  • 为什么我不能这样做?我得到编译错误。 那是Java8 我不认为这里违反了任何OO原则。 这真的让我很难实现通用 API...... (我试图将泛型从游戏中剔除,因为泛型API变得反直觉了)

  • 给定以下代码: 我得到错误“找不到名称IMyInterfaceA”。处理这种情况的正确方法是什么?

  • 这个问题直接类似于使用TypeScript进行类类型检查