java - 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
?
欢迎任何建议或替代想法。
提前致谢。
解决方案
您的类是抽象的这一事实完全无关紧要。如果您使它们抽象以防止它们的实例化,并使用继承来避免必须指定类名,那么这就是一种反模式,它不使用抽象类来实现多态性,因为它们打算被使用。只需向类添加一个私有构造函数,并使用静态导入。
现在,关于问题本身,您需要使方法通用,并且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());
}
推荐阅读
- roslyn - C# 代码分析 ProtectedAndInternal 与 ProtectedOrInternal
- websocket - 负载测试 couchbase 服务器 - 无法捕获从 couchbase lite 触发到 sync_gateway 的调用
- mysql - 如何将两个特定项目组合在一起
- docker - Dockerfile中“USER”定义的GID在Pod的容器中不起作用
- python - 应该被捕获和跳过的 ValueError,但会使程序崩溃
- java - 我的 nextDouble(); 扫描仪给我一个“找不到符号”错误
- google-chrome - MSAL Azure AD B2C 身份验证在 Chrome 中不起作用 - 隐身
- laravel - 未找到 Laravel Sync 无法正常工作的基表
- sql - 与聚合的 IN 相比,为什么 EXISTS 这么慢?
- java - 使用 Intent 在 Facebook 应用上打开帖子 ID