我们如何将T<S>
描述为方法的返回类型
<T,S> T<S> getResult(Class<T> tClass, Class<S> sClass)
答案 0 :(得分:9)
答案 1 :(得分: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
的类型为Class<ArrayList>
,而不是Class<ArrayList<String>>
。
但是我们可以使用super type token模式,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
,这在运行时无法帮助您。