gpt4 book ai didi

java - 带有参数化类的泛型类型的反射查找方法

转载 作者:行者123 更新时间:2023-11-30 04:18:19 28 4
gpt4 key购买 nike

我有一个具有以下签名的类(class):

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

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

public void setSelectedCriteria(T selectedCriteria) {
this.selectedCriteria = selectedCriteria;
}

public T getSelectedCriteria() {
return selectedCriteria;
}

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

public void setCriteriaType(Class<T> criteriaType){
this.criteriaType = criteriaType;
}
}

我将其实例化为 new MultipleSorting(ArticleSortField.class); 。这里ArticleSortFieldEnum 。现在通过 MultipleSorting 中的另一种方法当我尝试获取方法 setSelectedCriteria 时通过反射为:

Method setSelectedCriteriaMethod = getClass().getDeclaredMethod("setSelectedCriteria",getCriteriaType());

setSelectedCriteriaMethod正在返回null 。经过调试我发现getCriteriaType()正在返回类(class) ArticleDortFieldsetSelectedCriteria 的参数类型方法是Enum ,这就是反射返回 null 的原因.

此外,如果我更改 MultipleSorting 的签名如public class MultipleSorting<T>然后TsetSelectedCriteria正在成为Object .

  • 如何解决该问题?
  • 这是由于类型删除而发生的吗?我以为T将被 ArticleDortField 取代。但无法理解为什么它会这样。类型删除究竟是如何工作的?他们是否用具体实现替换了泛型类型?

任何指针都会对我非常有帮助。

最佳答案

解决您的问题的可能方法是查找“setSelectedCriteria”Method通过调用 getClass().getDeclaredMethod(...)使用所需的类型,然后使用其父类(super class)型,并沿着类层次结构向上移动,直到找到匹配的方法。这不是一个非常漂亮的解决方案,但它可能会起作用。

是的,这是由类型删除引起的。一旦你的代码被编译,就没有 <T>但只是Object ,没有<T extends Enum<?>>但只是Enum 。类型安全是由编译器检查的,但不是由 JVM 强制执行的。

关于java - 带有参数化类的泛型类型的反射查找方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17781785/

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