Java 静态方法、通配符/泛型 Return 类型

Java Static Method, Wildcard / Generic Return Type

我正在构建一个 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") on invokingMethod 并且 (2) 将 myMethod 的结果转换为列表MyClassType,调用时,即List<MyClassType> list = (List<MyClassType>) myMethod(MyClassType.class, converter, objects);。然而,对于使用 API 的任何人来说这都是必要的,这并不透明,感觉不太理想。

我有什么选择 myMethod 将调用它的类型的列表返回到 invokingMethod,同时保持我的抽象 类 和静态方法,同时理想地提高可用性在 invokingMethod?

之内

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

提前致谢。

您的 classes 是抽象的这一事实完全无关紧要。如果您将它们抽象化以防止它们的实例化,并使用继承来避免必须指定 class 名称,那么这是一个反模式,它不会像预期的那样使用抽象 classes 进行多态性要使用的。只需将私有构造函数添加到 classes,并使用静态导入。

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