为什么这个分支会破坏类型推断?

2023-11-29

我正在使用一个自行开发的实现Either在Java中,有这样的方法:

public static <L, R> Either<L, R> left(final L value);

public static <L, R> Either<L, R> right(final R value);

public <T> T fold(
        final Function<? super L, ? extends T> leftFunction,
        final Function<? super R, ? extends T> rightFunction); 

这两种方法编译并运行良好:

Either<Foo, Bar> rightToLeft() {
    Either<Foo, Bar> input = Either.right(new Bar());
    return input.fold(
        l -> null, 
        r -> Either.left(new Foo())
    );
}

Either<Foo, Bar> rightToRight() {
    Either<Foo, Bar> input = Either.right(new Bar());
    return input.fold(
        l -> null,
        r -> Either.right(new Bar())
    );
}

该方法无法编译:

Either<Foo, Bar> rightToLeftOrRightConditionally() {
    Either<Foo, Bar> input = Either.right(new Bar());
    return input.fold(
        l -> null, 
        r -> {
            if (r.equals("x")) {
               return Either.left(new Foo());
            }
            return Either.right(new Bar());
        });
}

Error:

incompatible types: inferred type does not conform to upper bound(s)
    inferred: Either<? extends Object,? extends Object>
    upper bound(s): Either<Foo,Bar>,java.lang.Object

(我已经删除了包限定符以使错误更具可读性)

我可以通过指定类型来编译它:

if (r.equals("x")) {
    return Either.<Foo, Bar> left(new Foo());
}
return Either.<Foo, Bar> right(new Bar());

但为什么我需要这样做?我怎样才能避免这种代码混乱?


这段代码应该可以工作。

它在最新的 JDK 1.8.0_121 上编译。

它无法在 JDK 1.8.0-51 上编译。

这意味着它很可能是此版本 JDK 中的错误,因为后续版本不应更改编译器的行为,除非修复错误。这可能是错误JDK-8055963.

所以,解决方案是:

  1. 升级你的编译器
  2. 如果您无法升级编译器(例如其他顽固的人拥有构建系统),请坚持使用现有的使类型显式的解决方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个分支会破坏类型推断? 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • 通过 Google Apps 帐户通过 C# 发送电子邮件

    我有一个标准的 Google Apps 帐户 我已通过 Google Apps 设置了自定义域 当我使用 Gmail 界面时 我能够通过 Google Apps 成功发送和接收电子邮件 但是 我想通过代码发送电子邮件 为了尝试这个 我一直在
  • 运营转型库?

    我正在寻找一个库 它允许我在多个用户之间实时同步文本 ala Google Docs 我偶然发现了运营转型 它似乎符合我的需求 话虽如此 我了解 OT 的要点 但不了解 OT 的数学或实施 因此 我想知道是否有一个拖放 JavaScript
  • 如果不可用,Schema.org dateModified 是否应该有一些默认值?

    对于 Schema orgArticle我收到错误https developers google com structured data testing tool for dateModified 建议使用 dateModified 字段
  • 搞乱编码和 XslCompiledTransform

    我正在搞乱编码 一方面 我有一个以 UTF 8 格式响应我的 url 我非常确定 感谢 firebug 插件 我使用以下代码打开读取 UTF 8 格式内容的 url StreamReader reader new StreamReader
  • 姜戈 CSRF 403

    获取 CSRF 403 下面的 console log 语句确认我正在获取令牌 我正在将请求提交到本地服务器上的同一域 internal csrfToken cookie csrftoken internal csrfSafeMethod
  • 使用线程调用 Py_Finalize 时出现 AssertionError(仅限 3.X)

    当我从与 python 调用不同的 C 线程调用 C API 的 Py Finalize 时 我收到错误输出 我看到的错误是 Exception ignored in
  • 使用 Mockito 匹配特定类型的空列表

    我有一个需要一些参数的方法 其中之一是某个类的 List 并且 null 是该参数的可接受值 public void doStuff String string Nullable List
  • 将参数传递给重写的 OnEndPage 方法

    我需要将参数传递给 OnEndPage 方法的重写版本 当我声明该参数时 我没有收到任何错误 但当我调用该方法时 它告诉我 无法将 void 隐式转换为 itextsharp text pdf ipdfpageevent 这是我的 OnEn
  • 配置 SQL*Plus 以仅返回数据

    我需要编写一个简单的 shell 函数 该函数从 Oracle DB 返回单个字段 举例来说SELECT ABC FROM dual ABC就是我所追求的 这是我的功能 function getSomeOraVal sqlplus USER
  • VBA有ATan2函数吗?

    我想计算一下atan2在 VBA 中 但我不确定该函数是否存在 或者甚至不确定在哪里可以找到内置 VBA 函数的规范列表 我没有使用 Excel 因此无法调用工作表 I could 实施 atan2我自己 但如果可能的话我宁愿避免这样做 正
  • 在 PHP 5.4 中禁用严格标准

    我目前在 php 5 4 上运行一个网站 在此之前我在 5 3 8 上运行我的网站 不幸的是 php 5 4 结合了E ALL and E STRICT 这意味着我之前的设置error reporting现在不起作用 我之前的值是E ALL
  • 如何阻止Spring Boot添加会话cookie?

    我有一个 Spring Boot Web 应用程序 我正在尝试将其设为无状态 在我的 WebSecurityConfigurerAdapter 中我设置了 http sessionManagement sessionCreationPoli
  • Twitter 用户脚本会影响除预期 (@included) 页面之外的页面吗?

    下面的用户脚本适用于我自己的 Twitter 个人资料页面 而不是时间线 UserScript name CoolScript include https twitter com IJNanayakkara include https tw
  • 如何使用 JavaScript 从 OneSignal 获取用户 ID?

    我在我的 webview 应用程序中实现了 OneSignal CURL 代码 该代码向每个用户发送通知 为了根据 OneSignal 的用户 ID 定位特定用户 我尝试使用下面的代码来获取用户 ID window OneSignal wi
  • 从进程中关闭正在运行的程序

    如何从子进程中关闭程序 分叉示例 import easygui import multiprocessing def func reply easygui buttonbox start image F project phonber pn
  • 如何用Java从给定的数字列表中生成随机数

    假设我有一个像 1 3 7 9 这样的数字数组 向量 那么我需要从这个列表中随机猜测一个数字 在 Java 中使用 Random 类似乎不可能做到这一点 谁能帮我告诉我一种做这种事情的方法 我必须更改用于生成随机数的数字列表 我正在尝试实施
  • Python 3.4 在生成一些(但不是全部)带有分段错误 11 的 Cartopy 地图时崩溃

    我已经在运行 El Capitan 10 11 6 和 Python 3 4 的 Mac 上安装了 Python 映射工具 Cartopy 我可以使用 Cartopy 成功绘制一些地图 但在某些情况下 Python 内核会因分段错误 11
  • 无法实例化类型 [简单类型,类 java.time.LocalDate] 的值

    这里我使用 java 1 8 的 LocalDate 类 在我的 bean 中 我将返回类型设置为 LocalDate 我发送日期格式为07 01 2017 当我试图保存时 我遇到了以下异常 org springframework web
  • 虚函数和纯虚函数之间的区别[重复]

    这个问题在这里已经有答案了 纯虚函数和虚函数有什么区别 我知道 纯虚函数是一个没有函数体的虚函数 但这是什么意思以及下面的行实际上做了什么 virtual void virtualfunctioname 0 虚函数使其类成为多态基类 派生类
  • 为什么这个分支会破坏类型推断?

    我正在使用一个自行开发的实现Either在Java中 有这样的方法 public static