Java静态方法,通配符/通用返回类型

时间:2018-10-24 22:16:33

标签: java generics functional-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)invokingMethod上的@SuppressWarnings(“ unchecked”),以及(2)将myMethod的结果强制转换为{{1} },即MyClassType。但是,没有透明度对于使用API​​的任何人都是必要的,这感觉并不理想。

List<MyClassType> list = (List<MyClassType>) myMethod(MyClassType.class, converter, objects);返回myMethod的类型列表的方式是什么,同时保持我的抽象类和静态方法,同时理想地提高invokingMethod内的可用性?

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

谢谢。

1 个答案:

答案 0 :(得分:2)

您的类是抽象的事实是完全不相关的。如果将它们抽象化以防止其实例化,并使用继承避免指定类名,则这是一种反模式,它不打算将抽象类用于多态性,因为它们打算被使用。只需在类中添加一个私有构造函数,然后使用静态导入即可。

现在,关于问题本身,您还需要使方法通用,并使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());
}