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

Java 如何定义方法参数的类型约束?,java,type-constraints,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
和接口
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) {}
我不接受这个解决方案,因为在我的例子中,我在第三方jar中有许多
A
的子类,我不想修改它们



我想知道它是否可以在语言级别上实现,在编写调用代码时启用该约束。

如果必须这样做,您可以使用泛型,如文档“多边界”部分中所述:

公共接口A{}
公共接口B{}
公共静态类C实现A,B{}
公共静态void foo(T型){
}
公共静态void main(字符串[]args){
foo(新的A(){});//编译错误
foo(new B(){});//编译错误
foo(新C(){});
}     

为什么不能将foo的签名更改为类似于
void foo(B)
?@Sneh在方法
foo(A x)
中,我想确保
x
A
B
我明白了@Karol的解决方案应该可以解决这个问题。我假设您不能修改
A
来实现
B
。但是,请注意,当使用反射时,该方法使用的参数类型仅为A。在运行时,该参数会在需要时转换为B。
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() {});
}