Java generics: get class of generic method's return type

后端 未结 2 498
-上瘾入骨i
-上瘾入骨i 2020-12-03 09:54

Background

I once wrote this method:

private  SortedSet createSortedSet() {
  return new TreeSet();
}

相关标签:
2条回答
  • 2020-12-03 10:28

    #ff0000 This doesn't work with all JVM!

    You can first create a generic object and then retrieve its parameterized type:

    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());
    }
    

    Beware! You don't get a Class<> object, you get a TypeVariableImpl subclass object, which may behave differently.

    0 讨论(0)
  • 2020-12-03 10:38

    Unfortunately, you will certainly have to change your method to:

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

    and then pass clazz as your second parameter. Not as short as you expected.

    0 讨论(0)
提交回复
热议问题