当前位置: 首页 > 知识库问答 >
问题:

具有Java 8 lambdas和可选的子类

澹台华晖
2023-03-14

我不明白为什么以下代码无法编译:

private ResponseEntity<JSendResponse> buildResponse(RequestModel requestModel,
                                                    RequestModelParamConverter paramConverter,
                                                    Supplier<String> xsdSupplier,
                                                    Supplier<String> xmlTemplateSupplier) {

    return Optional.ofNullable(new RequestErrorHandler<>().validate(validator, requestModel))
            .map(validationErrors -> new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST))
            .orElse(this.buildResponseForValidRequest(requestModel, paramConverter, xsdSupplier, xmlTemplateSupplier));
}

编译错误:

orElse(org.springframework.http.ResponseEntity

虽然这段代码(我认为逻辑上是相同的代码)确实可以编译:

private ResponseEntity<JSendResponse> buildResponse(RequestModel requestModel,
                                                    RequestModelParamConverter paramConverter,
                                                    Supplier<String> xsdSupplier,
                                                    Supplier<String> xmlTemplateSupplier) {

    JSendResponse validationErrors = new RequestErrorHandler<>().validate(validator, requestModel);

    if(validationErrors == null) {
        return this.buildResponseForValidRequest(requestModel, paramConverter, xsdSupplier, xmlTemplateSupplier);
    }
    else
    {
        return new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST);
    }
}

问题似乎是RequestErrorHandler

如果我将validationErrors强制转换为映射lambda中的JSendResponse,那么我可以编译它,但随后会丢失JSendFailResponse上的一些字段。

编辑:此代码也无法编译:

private ResponseEntity<? extends JSendResponse> buildResponse(RequestModel requestModel,
                                                    RequestModelParamConverter paramConverter,
                                                    Supplier<String> xsdSupplier,
                                                    Supplier<String> xmlTemplateSupplier) {

    return Optional.ofNullable(new RequestErrorHandler<>().validate(validator, requestModel))
            .map(validationErrors -> new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST))
            .orElse(this.buildResponseForValidRequest(requestModel, paramConverter, xsdSupplier, xmlTemplateSupplier));
}

EDIT2:这是一个简化的示例,您可以将其复制/粘贴到您的IDE中以供自己查看。

import java.util.*;

public class GemLamDemo {

    public static void main(String... args) {

        GemLamDemo gld = new GemLamDemo();

        gld.getList(null);

    }

    public List<? extends TypeA> getList(TypeA ta) {

        return Optional.ofNullable(ta)
                .map(a -> new ArrayList<TypeA>(Arrays.asList(a)))
                .orElse(new ArrayList<TypeB>(Arrays.asList(new TypeB())));
    }

    public class TypeA {

    }

    public class TypeB extends TypeA {

    }
}

EDIT3:我想我是根据目前为止收到的帮助来理解这个问题的,但下面的代码已经编译并运行了。

Optional.ofNullable(val1)
                .map(a -> new TypeA())
                .orElse(new TypeB());

所以问题似乎不是map和orElse必须返回相同的类型,这似乎与参数化有关。所以,map可以发出TypeA,如果它是TypeA的子类,orElse可以发出TypeB。但是它们不能发出不同的参数化类型的List。列表

响应性

编辑4:

上述示例不正确,因为类型是从原始案例切换而来的。我想我现在明白了,谢谢大家。

共有2个答案

潘畅
2023-03-14

如果检查oracle文档:https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html,

的签名。of nullable()方法是:公共静态

和<代码>orElse():<代码>公共T orElse(T其他)

所以两个方法类型上的参数都是TorElse()没有

您应该尝试以下内容(使用简化示例):

public List<TypeA> getList(TypeA ta) {

        ArrayList<TypeA> typeAinstance = new ArrayList<>();
        return Optional.ofNullable(ta)
                .map(a -> new ArrayList<TypeA>(Arrays.asList(a)))
                .orElse(typeAinstance.getClass().cast(Arrays.asList(new TypeB())));
    }

    public class TypeA {

    }

    public class TypeB extends TypeA {

    }

希望这能有所帮助

谯嘉木
2023-03-14

从map()发出的类型推断为JSendFailResponse,但您在orElse()中提供了不同的类型,这两种类型必须一致。

显式键入以使用公共类型调用map():

.<JSendResponse>map(validationErrors -> new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST))
 类似资料:
  • 问题内容: 如何使用https://www.amcharts.com/demos/line-chart-with-scroll-and- zoom/ 这样的图表 我对这些功能特别感兴趣 为了能够使用这两个选择控件选择域轴窗口。 为了能够通过选择部分域轴进行缩放。 为了能够缩小并查看大图。 为了能够映射到范围轴(Y)并在任意点(无标记)像工具提示一样查看该气球上的值 我在这里尝试了可滚动的JFree

  • 如何拥有像https://www.amcharts.com/demos/line-chart-with-scroll-and-zoom/这样的图表 null 我在这里做了初步尝试,可滚动JFree域轴和自定义标记标签,在垃圾上帝的帮助下,我使域可滚动。 我仍然缺少这些功能,以便能够有效地使用graph。

  • 问题内容: 考虑以下代码段: 控制台输出: 可选([1、4、9、16、25] [75、43、103、87、12] 为什么字典中有“ Optional”? 问题答案: 为了安全起见,Swift字典正在返回可选内容。如果您尝试访问一个不存在的密钥,那将使您无用。 您还可以使用下标语法从字典中检索特定键的值。因为可以请求不存在任何值的键,所以字典的下标返回字典值类型的可选值。如果字典包含所请求键的值,则

  • 这两种方法有什么区别:和? 请举个例子。

  • 我是jQuery/js的新手,遇到了这样的问题:您可以运行我的代码,发现计数不正确: null null 我的HTML必须保持不变,我必须找到一些方法使jQuery在本例中工作,并且保持HTML结构不变。如果您对如何解决此问题有任何想法,请随时发表评论或分享代码想法。 我感谢您的帮助!