我维护了 2 个具有相同功能的项目,并且我正在将此功能合并到一个公共(public)项目中。我定义了一个接口(interface):
public interface GraphData
{
public List<? extends ShapeData> getShapes();
public void setShapes( List<? extends ShapeData> shapes );
}
我在两个项目中都实现了这个接口(interface):
public class Graph implements GraphData
{
public List<Shape> shapes = new ArrayList<Shape>();
public List<? extends ShapeData> getShapes()
{
return shapes;
}
public void setShapes( List<? extends ShapeData> shapes )
{
this.shapes = shapes;
}
}
Shape
是 ShapeData
的子类型。当我编译此类时,出现有关强制转换的错误 List<Shape>
至List<? of...
如何解决这个编译错误?也许更好的问题是,我应该使用有界通配符(即?扩展)定义我的接口(interface)方法吗?
最佳答案
基本上,在我看来,你的界面太宽泛了。您已指定 shapes
(顺便说一下,这是一个公共(public)字段 - 为什么?)必须是 List<Shape>
。如果有人将错误类型的列表传递给 setShapes
,您会期望发生什么? ?例如:
public class BadShapeData implements ShapeData { ... }
...
List<BadShapeData> badShapes = new ArrayList<BadShapeData>();
new Graph().setShapes(badShapes);
这不是 Shape
的列表是吗?
您可以通过使界面通用来修复它:
public interface GraphData<T extends ShapeData>
{
List<T> getShapes();
void setShapes(List<T> shapes);
}
然后:
public class Graph implements GraphData<Shape>
或者,您可以更改您的界面不以拥有 setter 。你真的需要它吗?界面真的增加了很多好处吗?除了属性之外,您不能对其提供更多有意义的操作吗?
关于java - (Java) 如何使用有界通配符泛型实现接口(interface)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761289/