Java泛型:获取泛型方法的类';s返回类型 背景

Java泛型:获取泛型方法的类';s返回类型 背景,java,generics,jsp-tags,Java,Generics,Jsp Tags,我曾经写过这样的方法: private <T> SortedSet<T> createSortedSet() { return new TreeSet<T>(); } 我的求值方法中的代码显然不起作用。evaluator.evaluate()的第二个参数应该是类对象。这使我想到: 我的问题 如何获取泛型(返回)类型的类?我应该写什么来代替T作为第二个要计算的参数 编辑:结论 Nicolas似乎是对的,这是不可能的,我需要将类作为参数传递给我的方法。好处是

我曾经写过这样的方法:

private <T> SortedSet<T> createSortedSet() {
  return new TreeSet<T>();
}
我的求值方法中的代码显然不起作用。
evaluator.evaluate()
的第二个参数应该是类对象。这使我想到:

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

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

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

private <T> T evaluate(Class<T> clazz, String expression)
private T evaluate(类clazz,字符串表达式)
然后将
clazz
作为第二个参数传递。没有你想象的那么短

这不适用于所有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());
}
private T evaluate(字符串表达式){
List dummy=新的ArrayList(0);
类型[]actualTypeArguments=((ParameteredType)dummy.getClass().getGenericSuperclass()).getActualTypeArguments();
类型clazz=actualTypeArguments[0];
Class theClass=(Class)clazz.getClass();
ExpressionEvaluator=pageContext.getExpressionEvaluator();
返回evaluator.evaluate(表达式,类,null,pageContext.getVariableResolver());
}

当心!您没有得到一个
对象,而是得到一个
类型变量impl
子类对象,它的行为可能不同。

谢谢!在尝试了各种基于反思的想法后,我不能不同意你的观点。基本上,问题的存在是因为
Integer width = evaluate(widthStr);
private <T> T evaluate(Class<T> clazz, String expression)
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());
}