Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型类型不匹配_Java_Generics - Fatal编程技术网

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>>