首页 > 解决方案 > Java 静态方法、通配符/通用返回类型

问题描述

我正在构建一个 API,它使用抽象类来调用静态方法。一些Java伪代码:

public abstract class APIBaseClass {

    public static List<?> myMethod(Class<?> clazz, MyConverter converter, List<Object> objects) {
        return objects.stream()
                  .map(object -> converter.convertObjectToType(object, clazz))
                  .collect(Collectors.toList());
    }

}

并且,在哪里myMethod调用:

public abstract class MyAPIClass extends APIBaseClass {

    public static List<MyClassType> invokingMethod(MyConverter converter, List<Object> objects) {
        List<MyClassType> list = myMethod(MyClassType.class, converter, objects);
        ...
        return list;
    }
}

myMethod按预期编译。而且,invokingMethod由于类型不兼容,也无法按预期编译:

Required: List<blah.blah.blah.MyClassType>
Found:    List<capture<?>>

如果我: (1) @SuppressWarnings("unchecked") oninvokingMethod和 (2) 将 的结果myMethod转换为 , 调用时的列表MyClassType,即List<MyClassType> list = (List<MyClassType>) myMethod(MyClassType.class, converter, objects);. 但是,对于任何使用 API 的人来说,这并不透明,这感觉不太理想。

我有哪些选项可以myMethod返回调用它的类型列表 to invokingMethod,同时维护我的抽象类和静态方法,同时理想地提高内部的可用性invokingMethod

欢迎任何建议或替代想法。

提前致谢。

标签: javagenericsfunctional-java

解决方案


您的类是抽象的这一事实完全无关紧要。如果您使它们抽象以防止它们的实例化,并使用继承来避免必须指定类名,那么这就是一种反模式,它不使用抽象类来实现多态性,因为它们打算被使用。只需向类添加一个私有构造函数,并使用静态导入。

现在,关于问题本身,您需要使方法通用,并且MyConverter.convertObjectToType()方法也通用:

public static <T> List<T> myMethod(Class<T> clazz, MyConverter converter, List<Object> objects) {
    return objects.stream()
              .map(object -> converter.convertObjectToType(object, clazz))
              .collect(Collectors.toList());
}

推荐阅读