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

Java 8 可选不能应用于接口

寿子轩
2023-03-14

使用< code>Optional,我想根据映射结果返回接口的某个实现(< code>First或< code>Second)。这是< code>First和< code>Second实现的接口:

public interface MyInterface {
    Number number();
}

以下< code>Optional用法是错误的:

final String string = ...                          // might be null
final Number number = Optional.ofNullable(string)
        .map(string -> new First())
        .orElse(new Second())                      // erroneous line
        .number();

orElse(com.mycompany.First),可选

既然类<code>First<code>和<code>Second<code>都实现了接口<code>MyInterface<code>并且方法<code>MyInterface::number<code>返回<code>number<code>,为什么行会出错?如何正确实现这一点?

共有3个答案

姜彬郁
2023-03-14

我会在没有明确演员阵容的情况下写道:

Optional.ofNullable(string)
        .map(s -> {
             MyInterface m = new First();
             return m;  
        })
        .orElse(new Second())
        .number();
唐彦
2023-03-14

问题在于Java推断映射类型为<code>First</code>,而<code>Second</code>不是<code>First</code>的实例。您需要显式地给Java一些提示,以了解正确的类型:

private static void main(String... args)
{
    final String string = "";
    final Number number = Optional.ofNullable(string)
        .<MyInterface>map(str -> new First())  // Explicit type specified 
        .orElse(new Second())
        .number();
}

这是沿着方法链的类型推断的一般限制。不限于< code >可选。

有人建议沿方法链进行类型推断工作。请参阅此问题:泛型类型推断不适用于方法链接?

也许在未来版本的Java编译器会聪明到足以解决这个问题。谁知道呢。

袁智明
2023-03-14

我发现方法< code>Optional::map返回< code>U,它不允许将返回的< code>First应用到另一个类型,例如< code>Second。显式转换到其接口或在< code>map方法中要求它是一种方法:

final Number number = Optional.ofNullable("")
        .<MyInterface>map(string -> new First())
        .orElse(new Second())
        .number(); 

__

< sup >编辑:这个是我发帖后发现的。然而,我两个都留着,因为我还没有在其他地方找到类似的解决方案。

 类似资料:
  • 为了丰富运营体验,让开发者更好的体验积分商城功能,兑吧提支持更多的扩展功能 . 支持的扩展功能包含: 1. 游客用户唤醒登录 2. 自有虚拟商品充值 接口说明 充值接口API文档 通知接口API文档 3.加积分接口 接口说明 API文档 4.免登URL自定义参数 dcustom参数 transfer参数 signKeys参数 5. 会员等级功能 6.前置商品查询接口 7. 【秒杀商品】前置查询接口

  • 考虑一个和方法。我想将s映射到s并获得第一个。显而易见的解决方案是使用,但要求返回一个流,而没有方法(或者它是或提供一个方法将其转换为,或将其作为)查看。 我能想出的最好的办法是: 但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?

  • 使用Java8已经有6个多月了,我对新的API变化非常满意。我仍然不确定的一个方面是何时使用。我似乎在想要在任何地方都使用它(有些东西可能是)和根本不在任何地方)之间摇摆。 当我可以使用它时,似乎有很多情况,但我从来不确定它是增加了好处(可读性/空安全性)还是仅仅导致了额外的开销。 因此,我有几个例子,我想了解社区对是否有益的看法。 1-当方法可以返回时,作为公共方法返回类型: 2-当参数可能为时

  • 我在我的项目分级文件中收到了这样的警告: 警告:(16,5)“生成类型”不能应用于“(groovy.lang.closure )” 我的buildTypes部分是: 我目前使用的是Android Studio 1.1.0、CompilesDKVersion22、BuildToolsVersion22.0.0和TargetSDKVersion22。我试着退让到21岁,但还是收到了警告。 是什么导致了

  • 还是这些标准的功能接口(消费者、供应商、谓词、函数)是用来充当代码组织、可读性、结构、[其他]的模板?

  • 编译错误->[无法推断flatMap(函数>)的类型参数]