【发布时间】:2013-06-25 11:37:56
【问题描述】:
鉴于以下情况
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)
但是我怎样才能强制执行后一种推理方法呢?
感谢您的帮助!
给未来的读者:在这个问题的第一个版本中,我调用了BaseA 和ExtendedB。我后来澄清了这个符号。但是,答案中使用了此表示法。
【问题讨论】:
-
把第二个参数变成
Class<T>? -
这将禁止
test(a, B.class)而不是test(b, A.class)。 -
<T extends A, U extends T> void test(U x, Class<? T> test) { }? -
我不明白,我以为你想禁止 Class 参数是与第一个参数不同的类?
-
为了澄清,请标出以上4种情况中的哪一种不应该编译。您需要让我们知道什么应该允许,什么不应该。
标签: java generics type-inference