java - (Java) 如何使用有界通配符泛型实现接口(interface)方法?

标签 java generics bounded-wildcard

我维护了 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;
     }
}

ShapeShapeData 的子类型。当我编译此类时,出现有关强制转换的错误 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/

相关文章:

java - 返回无效 GZIP 的套接字 HTTP 请求

scala - 如何解决在逆变位置使用协变类型参数的问题

java - Mockito:使用有界通配符返回类型的 stub 方法

java - 在 Java 中使用 "super"和 "?"

java - 如何在android中将时间戳与当前时间进行比较,减去一定的分钟数

java - 从 Java Servlet 发送巨大的 json 对象

java - 将 RestTemplate 交换转换为 okHttpClient 调用

swift - Swift 中的继承、泛型和协议(protocol)

c# - 是否可以在 C# 泛型方法中定义 "not Nullable<T>"约束?

java - Java 通配符泛型 <?> 的 .NET 等效项具有协方差和逆方差?