例如,我想做类似的事情:
public void foo(Class c){
doSomething();
}
但我希望Class c
参数是已实现特定接口的类。有没有办法在编译时强制执行此操作?
答案 0 :(得分:4)
您可以使用泛型:
public void foo(Class<? extends SomeInterface> c){
doSomething();
}
答案 1 :(得分:1)
@Murelink有正确的答案。
然而
有没有办法在编译时强制执行?
这取决于你所说的“强制执行”。泛型是使用类型擦除在Java中实现的,并且Java运行时类型检查不会关注泛型类型约束。它仅检查参数的类型是否为Class
。
这意味着:
如果以反射方式执行调用,则在进行实际调用时运行时不会强制执行约束。
如果使用-source和-target合规性级别1.4或更早版本编写和编译一些调用者代码,则编译器不会强制执行约束。
关于这两件事,你无能为力。
答案 2 :(得分:0)
有没有办法在编译时强制执行此操作?
不是真的,就像@Stephen C指出的那样,但是您可以使用SomeInterfaceInterface.class.isAssignableFrom(c)