问问题
109 次
2 回答
9
你不能,基本上。没有办法描述“具有一个类型参数的泛型类型”并像这样使用它。
于 2013-05-13T16:15:31.777 回答
4
乔恩是对的,在一般情况下你不能这样做。但是如果我们考虑一个更具体的情况,比如返回一个特定List
类型的元素的特定类型,我们可以这样做:
<T, L extends List<T>> L getResult(Class<T> tClass, Class<L> lClass)
但接下来就是调用它的问题了。类仅由原始类型参数化。所以如果我们想这样称呼它:
ArrayList<String> result = getResult(String.class, ArrayList.class);
它不起作用,因为ArrayList.class
有 type Class<ArrayList>
,而不是Class<ArrayList<String>>
。
但随后我们可以使用超类型标记模式,Guava 的TypeToken
类使得它变得非常容易:
<T, L extends List<T>> L getResult(Class<T> tClass, TypeToken<L> lType) {
// use lType.getRawType()...
}
ArrayList<String> result =
getResult(String.class, new TypeToken<ArrayList<String>>(){});
当然,这只有在L
表示具体类时才有用。也可以创建一个TypeToken
using 类型参数,这在运行时对您没有帮助。
于 2013-05-13T16:57:54.507 回答