This question already has answers here:
Why can't assign I <? extends Type> to <Type>?
(2个答案)
What are the risks of explicitly casting from a list of type List<? extends MyObject> to a list of type List<MyObject> in Java?
(5个答案)
已关闭6年。
为什么以下代码会给出编译错误?
如果构建器类型是MyObject的子类,那么为什么不能将构建器分配为仅键入MyObject?我需要这样做,因为我无法在构建器中使用MyObject类型的对象。看下面的代码例如:
我觉得这应该被允许。还是我在这里想念什么?有没有一种方法可以在不将构建器强制转换为
还要注意,我需要Builder为
谢谢你的帮助!
然后根据契约(Contract),您只能添加
某些语言启用covariance:如果仅将
(2个答案)
What are the risks of explicitly casting from a list of type List<? extends MyObject> to a list of type List<MyObject> in Java?
(5个答案)
已关闭6年。
为什么以下代码会给出编译错误?
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;
}
如果构建器类型是MyObject的子类,那么为什么不能将构建器分配为仅键入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<MyObject>)
且不必使用@SuppressWarnings的情况下进行此操作?还要注意,我需要Builder为
<? extends MyObject>
,因为MyObject及其生成器将被子类化(因为它是抽象的)。谢谢你的帮助!
最佳答案
因为Foo<? extends Bar>
不是Foo<Bar>
。
说Foo
有一个方法:
void add (T t)
然后根据契约(Contract),您只能添加
T
对象。现在,如果将T
实例化为? extends Bar
,我们将不知道类型。接受Bar
可能会导致出现问题的行为:如果您有ArrayList<Foo>
,则希望ArrayList
仅包含Foo
实例。如果您将ArrayList<Foo>
视为ArrayList<SuperFoo>
,则不能保证ArrayList<Foo>
仅包含Foo
。某些语言启用covariance:如果仅将
T
用作输出,则可以说Foo<T>
类也与Foo<SuperT>
相同(与输入相同)。但是目前Java不支持该功能。但是,C#在接口(interface)级别上执行。关于Java泛型-无法从<转换?将MyObject>扩展到<MyObject>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28129538/
10-13 08:47