Вывод универсальных типов вложенных статических универсальных функций

Может ли компилятор 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 input) {
        return input.first();
    }
};

, которую я хочу использовать следующим образом ( Collections2.transform взят из Google Guava ):

List> values = ...
Collection firsts = Collections2.transform(values, 
        Pair.deferredFirst());

К которому компилятор жалуется:

The method transform(Collection, Function) 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;
}

12
задан Hal 7 June 2011 в 13:14
поделиться