4
4

2 回答 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表示具体类时才有用。也可以创建一个TypeTokenusing 类型参数,这在运行时对您没有帮助。

于 2013-05-13T16:57:54.507 回答