Java泛型类型不匹配
我有一个抽象类,定义为:Java泛型类型不匹配,java,generics,Java,Generics,我有一个抽象类,定义为: public abstract class TCV<T extends MF> { public Map<String, MVR<T>> operation() { ... } } 公共抽象类TCV{ 公共地图操作(){ ... } } 主要代码: TCV<? extends MF> o = new TCVConcrete(); Map<String, MVR< ? exte
public abstract class TCV<T extends MF> {
public Map<String, MVR<T>> operation() {
...
}
}
公共抽象类TCV{
公共地图操作(){
...
}
}
主要代码:
TCV<? extends MF> o = new TCVConcrete();
Map<String, MVR< ? extends MF>> map = o.operation();
TCV泛型系统无法理解两行中指示的泛型类型(当应用于具体实现时)在编译器执行其业务时实际上引用了相同的具体类型
TCV<? extends MF> o = new TCVConcrete();
Map<String, MVR< ? extends MF>> map = o.operation();
TCV这里的问题是您有两个不同的通用定义,它们可能是相同的:
TCV<? extends MF> o = new TCVConcrete();
^^^^^^^^^^^^
Map<String, MVR< ? extends MF>> map = o.operation();
^^^^^^^^^^^^^^
TCV问题是您使用了两个?通配符,基本上表示“MF或MF的某些未指定子类”。但这可能意味着MF的两个不同的子类;这就是作业类型不匹配的原因
您可能不想使用通配符。这应该起作用:
public void <T extends MF> doSomething(){
TCV<T> o = new TCVConcrete();
Map<String, MVR<T>> map = o.operation();
}
TCV<MF> o = new TCVConcrete();
Map<String, MVR<MF>> map = o.operation();
TCV o=new TCVConcrete();
Map Map=o.operation();
主要问题是因为无法将Box
强制转换为Box
,为什么?你可以认为
框可以包含猫和老虎,但是框只能包含老虎。如果将框
投射到框
,然后将黑猫
投射到框
:
或者更可能的情况是,调用几个operation():
Map您能发布TCVConcrete类的前几行吗?
TCV<MF> o = new TCVConcrete();
Map<String, MVR<MF>> map = o.operation();
Box<Cat> catBox = tigerBox;
catBox.throwHere(new BlackCat());
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
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>>
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();
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>>