我曾经写过这个方法:
private <T> SortedSet<T> createSortedSet() {
return new TreeSet<T>();
}
应该像这样调用:
Set<String> set = createSortedSet();
这很好用(虽然我在研究当前的问题时已经看到了答案,这很容易出错)。
无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中):
private <T> T evaluate(String expression) {
ExpressionEvaluator evaluator = pageContext.getExpressionEvaluator();
return evaluator.evaluate(expression, T, null, pageContext.getVariableResolver());
}
目的是能够将其称为:
Integer width = evaluate(widthStr);
我的evaluate方法中的代码显然不起作用。 evaluator.evaluate()
的第二个参数应该是一个Class对象。这导致我:
如何获得泛型(返回)类型的类?作为评估的第二个参数,我应该用什么来代替T?
Nicolas似乎是对的,它无法完成,我需要将类作为参数传递给我的方法。好处是,由于他的解决方案使参数在泛型类型上进行参数化,因此我会对该参数进行编译检查。
答案 0 :(得分:44)
不幸的是,您肯定必须将您的方法更改为:
private <T> T evaluate(Class<T> clazz, String expression)
然后将clazz
作为第二个参数传递。没有你想象的那么短。
答案 1 :(得分:0)
您可以先创建一个通用对象,然后检索其参数化类型:
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());
}
当心!您没有得到Class<>
对象,而得到了TypeVariableImpl
子类对象,它们的行为可能有所不同。