如何在方法的参数上定义类型约束?

时间:2018-09-20 08:24:14

标签: java type-constraints

我有类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 :(得分:3)

如果必须执行此操作,则可以按照Bounded Type Parameters文档“多重边界”部分中的说明使用泛型:

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() {});
}