【发布时间】:2011-10-26 15:48:22
【问题描述】:
我怀疑这个问题以前在这里被问过(并得到了回答),但我不知道如何命名这个问题。为什么只有当我没有通过课程本身时,我才能毫无问题地表达通配符?
这一切都归结为这段代码。除了对genericsHell(ShapeSaver.class) 的调用之外,一切都按预期进行:
interface Shape { }
interface Circle extends Shape { }
interface ShapeProcessor<T extends Shape> { }
class CircleDrawer implements ShapeProcessor<Circle> { }
class ShapeSaver<T extends Shape> implements ShapeProcessor<T> { }
class Test {
void genericsHeaven(ShapeProcessor<? extends Shape> a) {}
void genericsHell(Class<? extends ShapeProcessor<? extends Shape>> a) {}
void test() {
genericsHeaven(new CircleDrawer());
genericsHeaven(new ShapeSaver<Circle>());
genericsHell(CircleDrawer.class);
genericsHell(ShapeSaver.class); // ERROR: The method genericsHell is not applicable for the arguments (Class<ShapeSaver>)
}
}
【问题讨论】:
-
我希望有人能用英语解释一下。我很确定它与Covariance 问题有关,这意味着将
ShapeSaver分配给通用ShapeProcessor可能会导致运行时异常。但我不确定细节。 -
是的,我很想听听这个解释。喜欢这个标题。呼应我在这件事上的经验:)
-
+1 让我想起了我不久前问过的这个问题 stackoverflow.com/questions/6065998/… - 这可能是通过使用
.class丢失信息的类似问题 -
我喜欢这个问题的标题。有人可以用这个标题写一本书。
标签: java generics nested-generics