Java 8 可选不能应用于接口

2022-09-03 13:28:14

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

public interface MyInterface {
    Number number();
}

以下用法是错误的:Optional

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

或可选中的“可选”中的“可选”不能应用于(com.mycompany.First)(com.mycompany.Second)

为什么行是错误的,因为两个类和实现接口和方法都返回?如何正确实现这一点?FirstSecondMyInterfaceMyInterface::numberNumber


答案 1

我发现方法 Optional::map 返回不允许应用返回到另一种类型,例如。显式转换为其接口或在方法中要求它是一种方法:UFirstSecondmap

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

__

编辑:我在发布问题后发现了这一点。但是,我保留了两者,因为我还没有在其他任何地方找到类似的解决方案。


答案 2

问题在于 Java 推断映射的类型是 ,而不是 的实例。你需要明确地给Java一点提示,以了解正确的类型:FirstSecondFirst

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();
}

这是沿方法链的类型推断的一般限制。它不仅限于 .Optional

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

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


推荐