我刚知道这个fine looking syntax
Collections.<String>emptyList()
获取一个空的 List
,其中的元素应该是 String
类型。 Java 的源代码如下所示:
public static final List EMPTY_LIST = new EmptyList<Object>();
:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
现在,如果我以通用类型不出现在参数列表中的方式编写方法,有什么方法可以访问变为 T
的实际类?
我是说,到目前为止,我编写相同内容的方法是
private <T> T get(String key, Class<T> clazz) {
// here I can do whatever I want with clazz, e.g.:
return clazz.cast(value);
}
如果我删除了 clazz
参数,我将无法执行 cast()
。显然我可以做到
return (T) value;
但这给了我通常的警告 Type safety: Unchecked cast from Object to T
。好的,@SuppressWarnings("unchecked")
在这里有所帮助,但实际上我想对方法的预期返回类型做一些事情。如果我添加一个局部变量
T retValue;
我必须用一些东西来初始化它,null
没有帮助。在我分配它之后
@SuppressWarnings("unchecked")
T retValue = (T) value;
我可以做,例如
retValue.getClass().getName()
但如果转换失败,我将再次没有关于 T
的信息。
由于 Java(或至少我的 Java 6)在运行时不再有通用信息,我目前想不出办法来做到这一点。有办法吗?还是我必须在这里坚持我的“旧”方法?
请注意,我列出的示例非常简单,没有多大意义。我想在这里做更复杂的事情,但这超出了范围。
最佳答案
如果您想要在运行时使用泛型类型,您需要将其作为字段或为特定类型组合创建类型的子类。
例如
List<String> list = new ArrayList<String>() {}; // creates a generic sub-type
final Class type = (Class) ((ParameterizedType) list.getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
System.out.println(type);
打印
class java.lang.String
关于java - 没有参数时如何获取泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8436055/