Можно ли указать ограничения сверху и снизу на параметры типа в 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
}