鉴于以下情况
class Base { }
class Extended extends Base {}
我可以很容易地在泛型类的构造函数中请求一个类对象,它是泛型类型的某个子类。
class Test<T extends Base> {
Test(Class<? extends T> test) { }
}
这样我就可以做到以下所有
new Test<Base>(Base.class);
new Test<Base>(Extended.class);
new Test<Extended>(Base.class); // This is not allowed by the compiler
new Test<Extended>(Extended.class);
这正是我想要的。但是,当使用这样的通用方法时,我无法弄清楚如何实现相同的约束:
<T extends Base> void test(T x, Class<? extends T> test) { }
使用此定义,编译器允许以下所有内容:
test(new Base(), Base.class);
test(new Base(), Extended.class);
test(new Extended(), Base.class); // even though Base is not a subclass of Extended
test(new Extended, Extended.class);
我认为这是因为类型推断和 Java 确定
<Base>test(new Extended(), Base.class)
代替
<Extended>test(new Extended(), Base.class)
但是我怎样才能强制执行后一种推理方法呢?
感谢帮助!
对于未来的读者:在这个问题的第一个版本中,我调用了Base
A
and Extended
B
。我后来澄清了这个符号。然而,这个符号在答案中使用。