假设我们有一个这样的方法:
public void foo(Class<? extends ClassBar> x) {
...
}
通过修改通用表达式;
是否可以确保不能传递ClassBar.class,但是任何直接扩展或间接传递ClassBar的东西都可以传递,而不会在运行时引发异常?
最佳答案
如果只有一类扩展ClassBar
的类,则可以遵循以下两种方法。
解决方案1:
让ClassBar
的所有子类扩展自定义interface
(除了ClassBar
本身),并将方法签名更改为:
public <T extends ClassBar & MyInterface> void foo(Class<T> x) {
...
}
解决方案2:
使用类似于this @AndyTurner's trick的内容,并仅提供特定类型的实例。
例如:
class ClassBar {}
class ClassBarA extends ClassBar{}
class ClassBarB extends ClassBar{}
您的
class
包含foo
:class Foo<T extends ClassBar> {
private Foo() {} // private constructor
public static <T extends ClassBarA> Foo<T> instance(T c) {
return new Foo<T>();
}
public static <T extends ClassBarB> Foo<T> instance(T c) {
return new Foo<T>();
}
public void foo(Class<T> c) {
}
}
在这种情况下,只接受
ClassBarA
的子类Foo<ClassBarA> foo1 = Foo.instance(this.classBarA);
foo1.foo(ClassBarA.class); // pass
foo1.foo(ClassBar.class); // fail