我有类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
的许多子类,并且我不想修改它们。
我想知道是否可以在语言级别上实现,从而在我即时编写调用代码时启用该约束。
答案 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() {});
}