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

How to require .class parameter to be a certain class in Java?

例如,我想做这样的事情:

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

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

您可以使用泛型:

public void foo(Class<? extends SomeInterface> c){
    doSomething();
}

@Murelink 有正确答案。

但是

Is there a way to enforce this at compile time?

这取决于你所说的 "enforce" 是什么意思。泛型在 Java 中使用类型擦除实现,并且 Java 运行时类型检查不关注泛型类型约束。它只检查参数的类型是 Class.

这意味着:

  • 如果以反射方式执行调用,则在进行实际调用时运行时不会强制执行约束。

  • 如果您使用 -source 和 -target 合规级别为 1.4 或更早编写和编译某些调用方代码,则编译器不会强制执行约束。

对于这两件事你都无能为力。

Is there a way to enforce this at compile time?

不像@Stephen C 指出的那样,但您可以在运行时使用 SomeInterfaceInterface.class.isAssignableFrom(c)

输入检查