Можно ли указать ограничения сверху и снизу на параметры типа в Java?
Можно ли указать ограничения верхней и нижней границ для параметров типа в Java?
Я обнаружил беседу на форуме Sun, в которой обсуждалась эта проблема (очевидно, до того, как функция дженериков была завершена), но окончательного ответа не было.
Таким образом, существует ли правильный синтаксис для следующих действий?
public class MyClass<T extends Number super Integer>
Ответы
Ответ 1
Я так не верю - насколько я могу судить по спецификации языка, "супер" применим только для типов подстановочных знаков. Синтаксис для подстановочных знаков также предполагает, что вы можете иметь только один шаблон, также - вы не можете использовать что-то вроде этого:
// Invalid
void foo(List<? extends Foo super Bar> list)
Несмотря на то, что оба они в порядке:
// Valid
void foo(List<? extends Foo> list)
// Valid
void foo(List<? super Bar> list)
Как отмечено в комментариях, возможно иметь несколько верхних границ - но только для параметров типа и выражений. Например:
// Valid
<T extends Number & Comparable> void foo(List<T> list)
Ответ 2
Из руководства по Oracle:
Примечание. Вы можете указать верхнюю границу для подстановочного знака или нижнюю границу, но вы не можете указать оба.
Ответ 3
вы не можете указать оба одновременно, но вы можете достичь как заданный код.
class Family<F> {
F f;
public void setF(F f) {
this.f = f;
}
}
class GrandParent {
}
class Parent extends GrandParent {
}
class Child extends Parent {
}
private <T extends Parent> void foo(Family<? super T> list) {
list = new Family<Parent>(); // Allows
list = new Family<GrandParent>(); // Allows
list = new Family<Child>(); // Not Allows
list.setF(new GrandParent()); // Not Allows
list.setF(new Parent()); // Not Allows
list.setF(new Child()); // Not Allows
}
public void bar() {
foo(new Family<GrandParent>()); // Allows
foo(new Family<Parent>()); // Allows
foo(new Family<Child>()); // Allows
}