如何要求.class参数成为Java中的某个类?

时间:2015-02-07 22:32:36

标签: java class generics type-safety

例如,我想做类似的事情:

public void foo(Class c){
    doSomething();
}

但我希望Class c参数是已实现特定接口的。有没有办法在编译时强制执行此操作?

3 个答案:

答案 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)

在运行时键入check