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和允许这样做?!?
除了解释为什么我得到这个编译器错误,也许有人可以指出为什么我的方法是"糟糕的设计"以及我应该做些什么来纠正它.提前致谢!
想象一下,如果编译:
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