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