使用泛型的Java编译错误

IAm*_*aja 0 java generics inheritance

public class IRock
{
    public List<IMineral> getMinerals();
}

public class IMineral { ... }

public class SedimentaryMineral implements IMineral { ... }

public class SedimentaryRock implements IRock
{
    private List<SedimentaryMineral> minerals;

    @Override
    public List<SedimentaryMineral> getMinerals()
    {
        return minerals;
    }
}
Run Code Online (Sandbox Code Playgroud)

获取编译器错误:

Type mismatch: cannot convert from List<SedimentaryMineral> to List<IMineral>.
Run Code Online (Sandbox Code Playgroud)

我知道我无法将impl转换回其API接口(因为API只是 - 一个API).但我很困惑为什么我收到编译器错误!如果不是Java兑现的事实,SedimentaryMineral是的IMPL IMineral和允许这样做?!?

除了解释为什么我得到这个编译器错误,也许有人可以指出为什么我的方法是"糟糕的设计"以及我应该做些什么来纠正它.提前致谢!

Jef*_*rey 6

想象一下,如果编译:

List<SedementaryMineral> list = new ArrayList<>();
list.put(new SedimentaryMineral());

List<IMineral> mineralList = list;
mineralList.add(new NonSedimentaryMineral());

for(SedementaryMineral m : list) {
    System.out.println(m); // what happens when it gets to the NonSedimentaryMineral?
}
Run Code Online (Sandbox Code Playgroud)

那里有一个严重的问题.

你能做的是: List<? extends IMineral> mienralList = list