Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java静态方法,通配符/泛型返回类型_Java_Generics_Functional Java - Fatal编程技术网

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

Java静态方法,通配符/泛型返回类型,java,generics,functional-java,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(objec

我正在构建一个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
按预期编译。而且,
invokingMethod
由于不兼容的类型而无法编译,这也是意料之中的:

Required: List<blah.blah.blah.MyClassType>
Found:    List<capture<?>>
必需:列表

发现:列出你的类是抽象的这一事实是完全不相关的。如果您将它们抽象化以防止实例化,并使用继承来避免必须指定类名,那么这就是反模式,它不会像预期的那样将抽象类用于多态性。只需向类添加一个私有构造函数,并使用静态导入

现在,关于问题本身,您需要将方法设置为泛型,并将
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());
}
公共静态列表myMethod(类clazz、MyConverter转换器、列表对象){
返回objects.stream()
.map(对象->转换器.convertObjectToType(对象,clazz))
.collect(Collectors.toList());
}

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

现在,关于问题本身,您需要将方法设置为泛型,并将
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());
}
公共静态列表myMethod(类clazz、MyConverter转换器、列表对象){
返回objects.stream()
.map(对象->转换器.convertObjectToType(对象,clazz))
.collect(Collectors.toList());
}

myMethod(MyClassType.class,objectsList)
myMethod(class clazz,MyConverter converter,List objects)
不一样吗?你是说
对象
而不是
objectsList
?@tsolakp,是的。是的。谢谢。
myMethod(MyClassType.class,objectsList)
myMethod(class clazz,MyConverter converter,List objects)
不一样吗?你是说
对象
而不是
objectsList
?@tsolakp,是的。是的。谢谢。它们是抽象的,以避免实例化,是的。但是,我明白你的观点,它展示了一个反模式。谢谢你指出这一点。泛型需要实例化一个类,对吗?这就是你建议私人建造商的原因吗?或者,这是为了更正反模式吗?否。方法可以是泛型的,包括静态方法:。顺便说一句,您在代码中使用的Collectors.toList()就是这样一种静态泛型方法。私有构造函数与泛型无关:它允许阻止类的实例化。谢谢。我不得不坐着听你的回答几分钟才能理解它。你说得对。谢谢你的回答和解释。在
静态
列表
之间的
是让我挂断电话的原因。是的,它们是抽象的,以避免实例化。但是,我明白你的观点,它展示了一个反模式。谢谢你指出这一点。泛型需要实例化一个类,对吗?这就是你建议私人建造商的原因吗?或者,这是为了更正反模式吗?否。方法可以是泛型的,包括静态方法:。顺便说一句,您在代码中使用的Collectors.toList()就是这样一种静态泛型方法。私有构造函数与泛型无关:它允许阻止类的实例化。谢谢。我不得不坐着听你的回答几分钟才能理解它。你说得对。谢谢你的回答和解释。在
静态
列表
之间的
是让我挂断电话的原因。