Java泛型参数作为确切的子类?

时间:2018-03-01 15:07:26

标签: java reflection wildcard

假设我们有这样的方法:

public void foo(Class<? extends ClassBar> x) {
    ...
}

修改通用表达式;

  

&LT; ?扩展ClassBar&gt;

是否可以确保传递 ClassBar.class 但是任何扩展ClassBar都直接或间接地传递给 WITHOUT 抛出异常运行

1 个答案:

答案 0 :(得分:1)

如果你只有一大堆类ClassBar,你可以遵循这两种方法。

解决方案1:

ClassBar的所有子类扩展自定义interfaceClassBar本身除外),并将方法签名更改为:

public <T extends ClassBar & MyInterface> void foo(Class<T> x) {
    ...
}

解决方案2:

使用与this @AndyTurner's trick类似的内容,并仅为特定类型提供实例。

E.g:

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