gpt4 book ai didi

java - 使用默认方法从参数化接口(interface)中提取类

转载 作者:行者123 更新时间:2023-11-30 10:25:08 25 4
gpt4 key购买 nike

如何在接口(interface)中使用 Java 8 默认方法来提取参数化类型的类,而不是使用抽象类?

选项 1(失败):

public interface EpicCoolInterface<T> {

default Class<T> getParameterizedTypeClass() {
return T.class; //doesn't work
}

选项 2(失败):

public interface EpicCoolInterface<T> {

default Class<T> getParameterizedTypeClass() {
return (Class<T>) ((ParameterizedType) getClass().getGenericInterfaces()[0])
.getActualTypeArguments()[0];
//java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
}

第三次尝试(成功但无界面):

public abstract class CoolAbstractClass<T> {

private Class<T> clazz;

public CoolAbstractClass() {
try {
this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public Class<T> getType() {
return clazz;
}
}

最佳答案

实际上,您需要的是泛型类型推断。

虽然你的第三次尝试有效,但它只适用于特定情况(该类直接扩展抽象类)。

你可以使用我的工具类GenericUtil的方法

Type[] getGenericTypes(Type sourceType, Class<?> targetClass)

您可以在 github 上找到源代码和 javadoc .

对于你的问题,你可以这样定义你的接口(interface):

  public static interface EpicCoolInterface<T> {
// Return Type rather than Class, because T not always be a class.
// You can do type check and return Class<T> with force typecast.
default Type getParameterizedTypeClass() {
return GenericUtil.getGenericTypes(getClass(), EpicCoolInterface.class)[0];
}
}

然后让我们测试我们的代码:

  public static void main(String[] args) {
EpicCoolInterface<Integer> a = new EpicCoolInterface<Integer>() {
};
System.out.println(a.getParameterizedTypeClass());
EpicCoolInterface<EpicCoolInterface<Integer>> b = new EpicCoolInterface<EpicCoolInterface<Integer>>() {
};
System.out.println(b.getParameterizedTypeClass());
EpicCoolInterface<EpicCoolInterface<?>> c = new EpicCoolInterface<EpicCoolInterface<?>>() {
};
System.out.println(c.getParameterizedTypeClass());
}

输出:

class java.lang.Integer
xdean.stackoverflow.java.reflection.Q46360416.xdean.stackoverflow.java.reflection.Q46360416$EpicCoolInterface<java.lang.Integer>
xdean.stackoverflow.java.reflection.Q46360416.xdean.stackoverflow.java.reflection.Q46360416$EpicCoolInterface<?>

关于java - 使用默认方法从参数化接口(interface)中提取类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46360416/

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