Я хочу иметь обобщенный 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);
// [...]
}