【发布时间】:2015-01-24 19:48:28
【问题描述】:
为什么下面的代码会出现编译错误?
public MyObject(Builder<? extends MyObject> builder) {
// Type mismatch: cannot convert from MyObject.Builder<capture#5-of ? extends MyObject> to MyObject.Builder<MyObject>
Builder<MyObject> myObjBuilder = builder;
}
如果 Builder 类型是 MyObject 的子类,那么为什么不能将 builder 分配给只键入 MyObject 呢?我需要这样做,因为我无法将 MyObject 类型的对象与构建器一起使用。以这段代码为例:
public MyObject(Builder<? extends MyObject> builder) {
// The method getData(capture#8-of ? extends MyObject) in the type Builder<capture#8-of ? extends MyObject> is not applicable for the arguments (MyObject)
this.data = builder.getData(this);
}
我觉得应该允许这样做。或者我在这里错过了什么?有没有办法做到这一点,而无需将 builder 转换为 (Builder<MyObject>) 并且必须使用 @SuppressWarnings ?
另请注意,我需要 Builder 为 <? extends MyObject>,因为 MyObject 及其 Builder 将被子类化(因为它是抽象的)。
感谢您的帮助!
【问题讨论】:
-
@AlexisKing,我认为这个问题与那个问题不匹配,但我确实认为它需要与 What are the risks of explicitly casting from a list of type List<? extends MyObject> to a list of type List<MyObject> in Java? 相同的答案
-
我想我没有使用正确的搜索关键字。我看了一会儿。感谢您的链接
-
因为泛型是不变的,阅读:stackoverflow.com/questions/18666710/…