gpt4 book ai didi

java - 如何获取接口(interface)中泛型的实例

转载 作者:行者123 更新时间:2023-12-02 11:05:33 25 4
gpt4 key购买 nike

我有一个通用的接口(interface)

public interface MessageCallback<T extends JsonModel> {
void onMessage(T t);
}

我想获取 T 的实例。我找到了一个可以使用反射的解决方案

public static <T> Class<T> getGenericClass(Class actualClass, int index) {
ParameterizedType genericSuperclass = (ParameterizedType) actualClass.getGenericSuperclass();

// Get generic class
return (Class<T>) genericSuperclass.getActualTypeArguments()[index];
}

但是它抛出异常。

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

我想知道有没有不使用反射的解决方案?

额外。我也发现了这个

class Foo<T> {
final Class<T> typeParameterClass;

public Foo(Class<T> typeParameterClass) {
this.typeParameterClass = typeParameterClass;
}

public void bar() {
// you can access the typeParameterClass here and do whatever you like
}
}

但它仅适用于类。我该如何解决我的问题?感谢您的回答。

如果你想知道它不是干净的 Java。在 Android 中

最佳答案

关于您的第一个代码,Class.getGenericSuperclass()返回表示 this 的直接父类(super class)的类型类,那它Object在你的情况下。

Class.getGenericInterfaces()返回 Type s 代表 this 直接实现的接口(interface)类将是检索 MessageCallback 中定义的泛型的更好选择。接口(interface)。
但它可能不会帮助您,因为泛型类型将是 MessageCallback 中静态声明的类型。接口(interface):JsonModel而不是在扩展接口(interface)的子类声明中定义了哪一个。

关于你的第二个代码,你不应该担心捕获泛型的参数是否是 ClassType 。例如,在泛型类中声明的类型,如 interface MessageCallback<T extends JsonModel>或通用类的子类,例如 MessageCallbackImpl extends MessageCallback<MyJsonModel>是必要的类,因为参数化类型只能是 Class es.因此将泛型类型存储为 Class完全有效。
Type类是 Java 中所有类型的公共(public) super 接口(interface),其范围更广(原始类型、参数化类型、数组类型、类型变量和原始类型)

回到你的问题:你需要的是有一种方法在运行时引用编译时定义的泛型类型,这个习惯用法是一种经典的方法:

public Foo(Class<T> typeParameterClass) {
this.typeParameterClass = typeParameterClass;
}

关于java - 如何获取接口(interface)中泛型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com