gpt4 book ai didi

Java 泛型类型不匹配

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:16 25 4
gpt4 key购买 nike

我有一个抽象类定义为:

public abstract class TCV<T extends MF> {
public Map<String, MVR<T>> operation() {
...
}
}

主要代码:

TCV<? extends MF> o = new TCVConcrete();
Map<String, MVR< ? extends MF>> map = o.operation();

eclipse 错误:

Type mismatch: cannot convert from Map<String,MVR<capture#5-of ? extends MF>> to Map<String,MVR<? extends MF>>

编辑

public class TCVConcrete extends TCV<MFV2> {
}

public class MFV2 extends MF {
}

最佳答案

主要问题是因为你不能投Box<Tiger>Box<Cat> , 为什么?你可以认为它是,

A Box<Cat>可以包含猫和老虎,但是 Box<Tiger>只能包含老虎。如果你投 Box<Tiger>Box<Cat> ,然后你抛出一个 BlackCat进入Box<Tiger> :

Box<Cat> catBox = tigerBox;
catBox.throwHere(new BlackCat());

然后,tigerBox 损坏了。

让我将您的问题改写为:

public abstract class Company<T extends Cat> {
public Box<T> getFavBox() {
// ...
}
public Set<Box<T>> getBoxes() {
// ...
}
}

Company<? extends Cat> o = new ETCatCompany();
Box<? extends Cat> boxes = o.getFavBox(); // ok
Set<Box<? extends Cat>> boxes = o.getBoxes(); // error

如您所见,o.getFavBox()会工作但是o.getBoxes()不是,为什么?

因为,你不能把任何具体的猫扔进Box<? extends Cat> ,这可能会损坏未知框。但是,您可以抛出 Box<BlackCat>进入Set<Box<? extends Cat>> ,这可能会依次破坏 Set<Box<Tiger>> .

或者,您可能认为它是:

Cat ^ Tiger => Cat
Box<Cat> ^ BigBox<Cat> => Box<Cat>
Box<Cat> ^ Box<Tiger> => Box<? extends Cat>
Box<Cat> ^ BigBox<Tiger>
=> (Box<Cat> ^ BigBox<Cat>) ^ (BigBox<Cat> ^ BigBox<Tiger>)
=> Box<Cat> ^ BigBox<? extends Cat>
=> Box<? extends Cat> ^ BigBox<? extends Cat>
=> Box<? extends Cat>

Set<Box<Cat>> ^ Set<BigBox<Cat>> => Set<? extends Box<Cat>>
Set<Box<Cat>> ^ Set<Box<Tiger>> => Set<? extends Box<? extends Cat>>
Set<Box<Cat>> ^ Set<BigBox<Tiger>> => Set<? extends Box<? extends Cat>>

? extends Cat ^ ? extends Tiger => ? extends Cat
Box<? extends Cat> ^ BigBox<? extends Cat> => Box<? extends Cat>
Box<? extends Cat> ^ Box<? extends Tiger>
=> ? extends Box<? extends (? extends Cat)>
=> ? extends Box<? extends Cat>

Set<Box<? extends Cat>> ^ Set<BigBox<? extends Cat>>
=> Set<? extends Box<? extends Cat>>

Set<Box<? extends Cat>> ^ Set<Box<? extends Tiger>> // You are here.
=> Set<? extends Box<? extends Cat>>

Set<Box<? extends Cat>> ^ Set<BigBox<? extends Tiger>>
=> Set<? extends Box<? extends Cat>>

或者更可能的情况是,进行多次 operation() 调用:

Map<String, MVR<?1 extends MF>> x1 = o.operation();
Map<String, MVR<?2 extends MF>> x2 = o.operation();
...
Map<String, MVR<?n extends MF>> x2 = o.operation();

那么,所有的公共(public)类型是什么?

x1 ^ x2 ^ ... ^ xn
=> Map<String, MVR<?1 extends MF>> ^ Map<String, MVR<?2 extends MF>> ^ ...
=> Map<String, ? extends MVR<? extends MF>> ^ ...
...
=> Map<String, ? extends MVR<? extends MF>>

嗯,两个通配符肯定没问题,是关于数学归纳法...

关于Java 泛型类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5718409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com