Java編譯器是否能夠從其上下文中推斷泛型靜態函數的類型作爲另一個泛型靜態函數的參數?推測嵌套靜態泛型函數的泛型類型
例如,我有一個簡單的Pair類:
public class Pair<F, S> {
private final F mFirst;
private final S mSecond;
public Pair(F first, S second) {
mFirst = checkNotNull(first);
mSecond = checkNotNull(second);
}
public static <F, S, F1 extends F, S1 extends S> Pair<F, S> of(F1 first, S1 second) {
return new Pair<F, S>(first, second);
}
public F first() {
return mFirst;
}
public S second() {
return mSecond;
}
// ...
}
而且我有下面的一般靜態函數:
public static <F, P extends Pair<F, ?>> Function<P, F> deferredFirst() {
return (Function<P, F>)DEFERRED_FIRST;
}
private static final Function<Pair<Object, ?>, Object> DEFERRED_FIRST =
new Function<Pair<Object,?>, Object>() {
@Override
public Object apply(Pair<Object, ?> input) {
return input.first();
}
};
哪我希望用如下(Collections2.transform is from Google Guava):
List<Pair<Integer, Double>> values = ...
Collection<Integer> firsts = Collections2.transform(values,
Pair.deferredFirst());
編譯器抱怨到:
The method transform(Collection<F>, Function<? super F,T>) in the type
Collections2 is not applicable for the arguments
(List<Pair<Integer,Double>>, Function<Pair<Object,?>,Object>)
因此,編譯器似乎無法將transform()推斷的類型傳播給deferredFirst(),因爲它認爲它們是對象。
強迫編譯器瞭解類型通過以下兩種方式運作:
Function<Pair<Integer, ?>, Integer> func = Pair.deferredFirst();
Collection<Integer> firsts = Collections2.transform(values, func);
Collection<Integer> firsts = Collections2.transform(values,
Pair.<Integer, Pair<Integer, ?>>deferredFirst());
是否有可能改變任何一個函數的簽名,讓編譯器推斷/傳播的類型?
編輯:對於波西米亞,這裏是一個可能的方法上面的例子可以用於:
public static int sumSomeInts(List<Pair<Integer, Double>> values) {
Collection<Integer> ints = Collections2.transform(values,
Pair.deferredFirst());
int sum = 0;
for(int i : ints)
sum += i;
return sum;
}
要小心,當你有'A級 {公共無效方法(){}}'。我的猜測是,'樓S'的方法來覆蓋從你的類{){}公共
無效方法(}' – toto2 2011-06-07 12:57:20