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).
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:
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?
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.
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.