gpt4 book ai didi

java - 获取参数化类 T extends Enum 的实际枚举类

转载 作者:行者123 更新时间:2023-12-01 14:19:19 24 4
gpt4 key购买 nike

我有一个类:

public class MultipleSorting<T extends Enum<?>> {
private T criteriaType;

public Class<T> getCriteriaClass() {
Field field = ReflectionUtils.getField(getClass(),"criteriaType");
ReflectionUtils.makeAccessible(field);
return (Class<T>)field.getType();
}
}

该类被实例化为:

public abstract class MultiSortPageableController<T extends MultiSortPageableController<?,?>, U extends Enum<?>> {
private MultipleSorting<U> multipleSorting;

public MultiSortPageableController() {
super();

multipleSorting = new MultipleSorting<U>();
}
}

U 的实际值是从 MultiSortPageableController 的子类传递的,即:

public abstract class AbstractArticleSearchController<T extends AbstractArticleSearchController<T>> extends MultiSortPageableController<T,ArticleSortField> {

}

ArticleSortField 是一个Enum

我期望 MultipleSorting 的方法 getCriteriaClass 会从 MultiSortPageableController 的方法返回 ArticleSortField。但它正在返回java.lang.Enum

我无法弄清楚为什么它没有返回实际的枚举以及如何才能做到这一点。任何指针都会对我非常有帮助。我需要获取ArticleSortField

目的:

我有两个要求:

  1. 获取枚举类型的实际类(例如 ArticleSortField.class)
  2. 列出枚举值。如果我有枚举类,那么我可以调用class..getEnumConstants()

最佳答案

Java 编译器会删除有关泛型的信息,因此当您使用反射时,除了 Enum 之外,您不会获得有关声明类型的信息。这个过程称为type erasure .

如何通过构造函数向下传递类型,如下所示:

public class MultipleSorting<T extends Enum<?>> {
private Class<T> criteriaType;

MultipleSorting(Class<T> criteriaType) {
this.criteriaType = criteriaType;
}

public Class<T> getCriteriaClass() {
return criteriaType;
}
}

public abstract class MultiSortPageableController<T extends MultiSortPageableController<?, ?>, U extends Enum<?>> {
private MultipleSorting<U> multipleSorting;

public MultiSortPageableController(Class<U> criteriaType) {
super();

multipleSorting = new MultipleSorting<U>(criteriaType);
}
}

public abstract class AbstractArticleSearchController<T extends AbstractArticleSearchController<T>> extends MultiSortPageableController<T, ArticleSortField> {
public AbstractArticleSearchController() {
super(ArticleSortField.class);
}
}

关于java - 获取参数化类 T extends Enum<?> 的实际枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17763803/

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