Java泛型参数作为精确子类?

Java泛型参数作为精确子类?,java,reflection,wildcard,Java,Reflection,Wildcard,假设我们有这样一种方法: public void foo(Class如果您只有一堆扩展ClassBar的类,那么您可以遵循这两种方法 解决方案1: 让ClassBar的所有子类扩展自定义接口(除了ClassBar本身),并将方法签名更改为: public <T extends ClassBar & MyInterface> void foo(Class<T> x) { ... } 您的类包含foo: class Foo<T extends Cla

假设我们有这样一种方法:


public void foo(Class如果您只有一堆扩展
ClassBar
的类,那么您可以遵循这两种方法


解决方案1:

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

public <T extends ClassBar & MyInterface> void foo(Class<T> x) {
    ...
}
您的
包含
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) {

    }

}

因此,唯一的选择是查看它是否是Modifier.isAbstract(x.getModifiers())或者直接检查它是否是ClassBar.class。你是否有很多类扩展了
ClassBar
?是的,除了
ClassBar
,你想把它们交给
foo
方法。我应该在方法内部处理还是有办法在编译时看到它们?好的,我也看到了你的评论late@luk2302您仍然可以通过
ClassBar.class
尽管是
抽象的
。他特别想过滤对函数的访问
ClassBar
将被用作处理程序类的
抽象的
基础。因此依赖库可以扩展
ClassBar
来实现自己的处理程序。但我认为没有办法编写类似这样的表达式
@iGoodie通常
处理程序
接口
,这迫使您有一个实现。我个人会遵循标准模式
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) {

    }

}
Foo<ClassBarA> foo1 = Foo.instance(this.classBarA);
foo1.foo(ClassBarA.class); // pass
foo1.foo(ClassBar.class);  // fail