I once wrote this method:
private SortedSet createSortedSet() {
return new TreeSet();
}
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.
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.