Как определить ограничение типа по параметру метода? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть класс A и интерфейс B, а также метод:

void foo(A x) {}

Я хочу определить ограничение для параметра x, которое должно реализовывать интерфейс B.


Хотя я знаю, что это можно сделать во время выполнения, например:

void foo(A x) {
    if (!(x instanceof B)) {
        throw new IllegalStateException();
    }
}

Или определить другой класс и изменить сигнатуру метода, например:

class C extends A implements B {}

void foo(C x) {}

Я не принимаю это решение, поскольку в моем случае у меня есть много подклассов A в стороннем банке, и я не хочу их изменять.


Интересно, может ли это бытьдостигается на уровне языка, позволяя это ограничение, когда я пишу код вызова, на лету.

1 Ответ

0 голосов
/ 20 сентября 2018

Если вам нужно сделать это, вы можете использовать обобщенные значения, как описано в Параметры ограниченного типа документы, раздел «Несколько границ»:

public interface A {}
public interface B {}
public static class C implements A, B {}

public static <T extends A & B> void foo(T type) {

}

public static void main(String[] args) {
  foo(new A() {}); // compile error
  foo(new B() {}); // compile error
  foo(new C() {});
}     
...