Java 泛型:获取泛型方法的返回类型的类

2022-09-01 02:34:20

背景

我曾经写过这个方法:

private <T> SortedSet<T> createSortedSet() {
  return new TreeSet<T>();
}

它应该这样称呼:

Set<String> set = createSortedSet();

这工作正常(尽管我在研究当前问题时已经在这里的答案中看到这很容易出错)。

二. 目前的情况

无论如何,现在我正在编写以下代码(在扩展javax.servlet的类中.jsp.tagext.TagSupport):

private <T> T evaluate(String expression) {
  ExpressionEvaluator evaluator = pageContext.getExpressionEvaluator();
  return evaluator.evaluate(expression, T, null, pageContext.getVariableResolver());
}

目的是能够像这样调用它:

Integer width = evaluate(widthStr);

我的评估方法中的代码显然不起作用。的第二个参数应该是一个 Class 对象。这导致我:evaluator.evaluate()

我的问题

如何获取泛型(返回)类型的类?我应该写什么来代替T作为第二个要评估的参数?

编辑:结论

Nicolas似乎是对的,它不能完成,我需要将类作为参数传递给我的方法。好处是,由于他的解决方案使参数在泛型类型上参数化,因此我对该参数进行了编译检查。


答案 1

不幸的是,您肯定必须将方法更改为:

private <T> T evaluate(Class<T> clazz, String expression)

,然后作为第二个参数传递。没有你预期的那么短。clazz


答案 2

#ff0000这不适用于所有JVM!

您可以先创建一个泛型对象,然后检索其参数化类型:

private <T> T evaluate(String expression) {
  List<T> dummy = new ArrayList<>(0);
  Type[] actualTypeArguments = ((ParameterizedType) dummy.getClass().getGenericSuperclass()).getActualTypeArguments();
  Type clazz = actualTypeArguments[0];
  Class<T> theClass = (Class<T>) clazz.getClass();

  ExpressionEvaluator evaluator = pageContext.getExpressionEvaluator();
  return evaluator.evaluate(expression, theClass, null, pageContext.getVariableResolver());
}

小心!你没有得到一个对象,你得到一个子类对象,它的行为可能不同。Class<>TypeVariableImpl


推荐