Ну, есть нотация <T extends A & B> f(T ab)
, но вы должны отдавать предпочтение композиции, а не наследованию. Вам не нужно ничего расширять. Просто создайте тип, который является совместным объединением (продукт) обоих типов A
и B
, следующим образом:
public abstract class P2<A, B> {
public A _1();
public B _2();
}
Иногда называется продуктом-2 или типом "пара". Вы можете создать удобный конструктор для них:
public final class P {
private P() {}
public static <A, B> P2 p(final A a, final B b) {
return new P2<A, B>() {
public A _1() {
return a;
}
public B _2() {
return b;
}
}
}
}
Обратите внимание, что вы можете использовать один и тот же объект для обоих аргументов, если A
и B
являются интерфейсами и ваш объект реализует оба из них:
P2<A, B> both = P.p(o, o);
Или вы можете использовать два разных объекта, делая дизайн красивым и отделенным.
Вы найдете этот тип, а также продукты до 8 типов, включенные в библиотеку Functional Java . Также существует тип с именем Either<A, B>
, представляющий собой несвязное объединение (сумма) двух типов, так что он содержит значение, имеющее тип A
или B
(или оба).