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());
}
我正在构建一个 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());
}