如何要求.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)
输入检查
例如,我想做这样的事情:
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)