Обходной путь для нижней границы параметра типа метода - PullRequest
0 голосов
/ 30 марта 2020

Я хочу иметь обобщенный c класс Foo<T> с методом экземпляра operation, который принимает другой объект Foo, other и возвращает новый объект Foo с его конкретным параметром типа, представляющим собой супертип как this * T, так и other * T.

То есть что-то вроде:

public abstract class Foo<T> {
    public abstract <U super T> Foo<U> operation(Foo<? extends U> other);
}

, если это разрешено.

Теперь я знаю, что нижние границы для параметров типа недопустимы , и я знаю общее обоснование этого. Но в данном конкретном случае они были бы полезны. (Er go, обратите внимание, что я не спрашиваю , разрешены ли , или , почему они не разрешены .) Так что я ищу обходной путь.

Ни один из двух перечисленных обходных путей здесь не работает, потому что нужен точный тип возврата Foo<U> (я не могу его стереть в Foo<Object>), и я не могу превратить его в метод stati c, потому что метод абстрактный (это polymorphi c).


Чтобы лучше проиллюстрировать полезность этого Вот более конкретный пример:

public interface DynamicSet<E> {   
    // [...]

    /** set-theoretic union */
    <S super E> DynamicSet<S> union(DynamicSet<? extends S> other);

    // [...]
}

Эквивалентный метод stati c:

public interface DynamicSet<E> {   
    // [...]

    /** set-theoretic union */
    static <S> DynamicSet<S> union(DynamicSet<? extends S> a, DynamicSet<? extends S> b);

    // [...]
}
...