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

Peter Jaric picture Peter Jaric · Nov 18, 2010 · Viewed 35k times · Source

Background

I once wrote this method:

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

It's supposed to be called like this:

Set<String> set = createSortedSet();

This works fine (although I've seen in answers here when researching the current question that this is error-prone).

The current situation

Anyway, now I am writing the following code (in a class that extends javax.servlet.jsp.tagext.TagSupport):

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

The purpose is to be able to call this like:

Integer width = evaluate(widthStr);

The code in my evaluate method obviously doesn't work. The second argument to evaluator.evaluate() is supposed to be a Class object. This leads me to:

My question

How can I get the Class of a generic (return) type? What should I write in place of T as the second argument to evaluate?

EDIT: Conclusion

Nicolas seems to be right, it can not be done and I need to pass the class as an argument to my method. The upside is that since his solution makes the argument parametrized on the generic type I get a compilation check on that argument.

Answer

Nicolas picture Nicolas · Nov 18, 2010

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.