我正在构建一个使用抽象类的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
内的可用性?
欢迎提出任何建议或替代想法。
谢谢。
答案 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());
}