繁体   English   中英

当接口方法的泛型返回使用 Java 中的具体类型实现时,如何避免“未检查覆盖”警告?

[英]How can I avoid an "Unchecked overriding" warning when interface method's generic return is implemented with a concrete type in Java?

这是一个与爱好项目相关的教育问题。 项目 Spring 启动 MVC/REST 应用程序。

我想保留能够创建多个 Service 实现的灵活性,并让 list 返回一个对象列表,具体取决于实现的要求。

我很感激我可以创建一些继承/实现层次结构来定义 T 可以包含的对象类型。 我对这两个答案的问题是,服务的一些用例涉及我需要返回 Java 标准库类型的列表——我不想为我自己的自定义类继承/扩展/实现的类型,我希望保持精简尽可能。

import java.util.List;

interface Service {
    <T> List<T> list(String location, MyEnums.mediaType type );
}

class MyEnums {
    enum mediaType {
        IMAGE, VIDEO, AUDIO
    }
}

class LocalService implements Service {
    public List<MyConcreteClass> list(String location, MyEnums.mediaType type ) {
        List<MyConcreteClass> list = null;
        list.add(new MyConcreteClass(1, "foo", new byte[0]));
        return list;
    }
}

class MyConcreteClass implements Comparable<MyConcreteClass> {

    private final long id;
    private final String name;
    private final byte[] data;

    public MyConcreteClass(long id, String name, byte[] data) {
        this.id = id;
        this.name = name;
        this.data = data;
    }


    @Override
    public int compareTo(MyConcreteClass o) {
        return this.name.compareTo(o.name);
    }

    // Other methods omitted for brevity
}


上面的代码只是实际应用程序代码的简化示例——它编译和运行时没有任何(已知的)运行时错误。 但是我收到编译器警告:

未经检查的覆盖:返回类型需要未经检查的转换。

警告的存在对我来说很有意义 - 如果调用代码中的返回类型要求与实现不兼容,使用 Service 接口/API 的代码可能会在运行时中断,而如果我有更具体的错误将在编译时捕获List<> 定义在接口中。

当然,如果我必须将具体的实现连接到使用我的服务的代码中,这当然不是问题——但是 Spring 的乐趣!

我究竟做错了什么? 我怎样才能解决这个问题? 在我的情况下,generics 是实现多态 list() function 的正确方法吗?

您可以通过使用类型参数(而不是方法)声明接口本身来消除未经检查的强制转换。 像这样:

interface Service<T> {
    List<T> list(String location, String type );
}

class LocalService implements Service<MyConcreteClass> {
    @Override
    public List<MyConcreteClass> list(String location, String type ) {
        // Some logic to retrieve, alter and return a list
        return null;
    }
}

class StringService implements Service<String> {
    @Override
    public List<String> list(String location, String type) {
        // TODO Auto-generated method stub
        return null;
    }
}

class MyConcreteClass {
    /// ...
}

(我改变了几件事以使其编译,与答案无关)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM