Может ли компилятор Java вывести тип общей статической функции из своего контекста в качестве аргумента другой универсальной статической функции?
Например, У меня есть простой класс Pair:
public class Pair {
private final F mFirst;
private final S mSecond;
public Pair(F first, S second) {
mFirst = checkNotNull(first);
mSecond = checkNotNull(second);
}
public static Pair of(F1 first, S1 second) {
return new Pair(first, second);
}
public F first() {
return mFirst;
}
public S second() {
return mSecond;
}
// ...
}
И у меня есть следующая общая статическая функция:
public static > Function deferredFirst() {
return (Function
)DEFERRED_FIRST;
}
private static final Function, Object> DEFERRED_FIRST =
new Function, Object>() {
@Override
public Object apply(Pair
, которую я хочу использовать следующим образом ( Collections2.transform взят из Google Guava ):
List> values = ...
Collection firsts = Collections2.transform(values,
Pair.deferredFirst());
К которому компилятор жалуется:
The method transform(Collection, Function super F,T>) in the type
Collections2 is not applicable for the arguments
(List>, Function,Object>)
Таким образом, кажется, что компилятор не может передать типы, выведенные для transform (), в deferredFirst (), поскольку он считает их Объектами.
Принуждение компилятора понимать типы любым из этих способов работает :
Function, Integer> func = Pair.deferredFirst();
Collection firsts = Collections2.transform(values, func);
Collection firsts = Collections2.transform(values,
Pair.>deferredFirst());
Можно ли изменить сигнатуру любой функции, чтобы компилятор мог определять / распространять типы?
Редактировать: Для Bohemian вот возможный метод, в котором может использоваться приведенный выше пример:
public static int sumSomeInts(List> values) {
Collection ints = Collections2.transform(values,
Pair.deferredFirst());
int sum = 0;
for(int i : ints)
sum += i;
return sum;
}