假设我们有一个这样的方法:

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

10-04 22:45