Java 交集类型与接口类和类型变量的限制

2023-12-15

今天,我尝试编写一个具有使用交集类型的泛型方法的类,但根据交集类型的不同错误消息而感到困惑。假设我们有一个interface and a class并在通用接口中定义通用方法:

class ClassType {
}

interface InterfaceType {
}

interface I<T> {
    public <X extends InterfaceType & InterfaceType> void foo();

    public <X extends ClassType & ClassType> void foo1();

    public <X extends ClassType & InterfaceType> void foo2();

    public <X extends InterfaceType & ClassType> void foo3();

    public <X extends T & ClassType> void foo4();

    public <X extends ClassType & T> void foo5();

    public <X extends InterfaceType & T> void foo6();

    public <X extends T & InterfaceType> void foo7();
}

编译此方法会对除以下方法之外的所有方法产生错误public <X extends ClassType & InterfaceType> void foo2();.

Main.java:8: error: repeated interface
    public <X extends InterfaceType & InterfaceType> void foo();
                                      ^
Main.java:10: error: interface expected here
    public <X extends ClassType & ClassType> void foo1();
                                  ^
Main.java:14: error: interface expected here
    public <X extends InterfaceType & ClassType> void foo3();
                                      ^
Main.java:16: error: a type variable may not be followed by other bounds
    public <X extends T & ClassType> void foo4();
                          ^
Main.java:18: error: unexpected type
    public <X extends ClassType & T> void foo5();
                                  ^
  required: class
  found:    type parameter T
  where T is a type-variable:
    T extends Object declared in interface I
Main.java:20: error: unexpected type
    public <X extends InterfaceType & T> void foo6();
                                      ^
  required: class
  found:    type parameter T
  where T is a type-variable:
    T extends Object declared in interface I
Main.java:22: error: a type variable may not be followed by other bounds
    public <X extends T & InterfaceType> void foo7();
                          ^
7 errors

由于交叉点应该是对称的,我很惊讶foo2被接受但是foo3被拒绝。为什么这一案例会被受理?

我还想知道为什么在交集类型方面接口、类和类型参数之间存在区别。我可以看到不允许交叉类型中存在多个类的原因,但当前状态接受ClassType & InterfaceType但不是InterfaceType & ClassType似乎很随意。一个十字路口A & A也是被禁止的,但这在语义上与A所以我不认为这是有原因的。

我也很好奇为什么类型变量不允许出现在交集中。最坏的情况是两个或多个类的交集,但只是无人居住的类型,因此是底部类型。


你只能有 1 个类,但有多个接口。如果您有一个类,它必须是第一个指定的类。如果遵循此规则,则不应出现任何编译错误。

See https://docs.oracle.com/javase/tutorial/java/generics/bounded.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 交集类型与接口类和类型变量的限制 的相关文章

随机推荐

  • 仅在运行测试时出现 DexIndexOverflowException

    我可以在调试和发布变体中成功构建并运行我的 Android 应用程序 没有任何问题 然而 当我尝试运行新的单元测试 我以前从未进行过 时 我得到了可怕的结果DexIndexOverflowException 我猜测ProGuard没有与我的
  • 如何将这个elasticsearch函数分数查询转换为java API

    如何将下面的ES查询转换为Java API 我正在使用弹性搜索2 3 3 GET schema name search from 0 size 200 query function score query match all boost 5
  • 如何使用 boost::property_tree 解析带有数组根的 JSON

    如何使用 Boost PropertyTree 从以数组为根节点的 JSON 中获取数据 ID cc7c3e83 9b94 4fb2 aaa3 9da458c976f7 Type VM 数组元素只是属性树中带有名为 的键的值 for aut
  • 在Java中显示数字的前n位

    当用户确定 n 时 我很难创建一种显示数字前 n 位的方法 例如 用户输入整数 1234567 和若干位数以显示 3 然后该方法输出 123 我有一个想法如何显示第一个数字 long number 52345678 long prefix
  • C# - 使用 webbrowser 控件将字符串传递到网页中的文本框

    有没有办法在使用网络浏览器控件时获取字符串的值并将其传递到网页内的文本框 HtmlDocument doc this webBrowser1 Document doc GetElementById myId SetAttribute Val
  • ImageIO.read 返回 NULL,没有错误

    尽管文件看起来很好找到 但以下代码似乎不起作用 images new BufferedImage 32 FileInputStream fis null for int i 0 i lt 32 i File file new File ti
  • Rscript 在本地构建中指向不正确的 R 版本

    我最近在Linux Redhat服务器上安装了本地版本的R 3 1 0 如下 from R 3 1 0 directory configure prefix pwd make make install 此外 我还更新了 bashrc 中的
  • 简单的喜欢/不喜欢文本按钮 - 添加 ajax 等

    我正在尝试用 PHP 制作一个非常简单的 Like Unlike 按钮 页面不刷新 我知道有无数关于这方面的教程 但因为我对 ajax 和 jquery 完全陌生 所以我不知道如何实现它们 代码的哪一部分在哪个文件中执行等 我有一个用户 I
  • 正则表达式防止尾随空格和额外空格

    现在我有一个正则表达式可以防止用户输入任何特殊字符 唯一允许的字符是 A 到 Z 0 到 9 或空格 我想改进这个正则表达式以防止出现以下情况 无前导 训练空格 如果用户在条目之前或之后键入一个或多个空格 则不允许 不允许使用双空格 如果用
  • 将 Yaml 中的列表映射到 Spring Boot 中的对象列表

    在我的 Spring Boot 应用程序中 我有 application yaml 配置文件 其中包含以下内容 我想将其作为带有通道配置列表的配置对象注入 available payment channels list xyz 123 ch
  • 在 Xdebug v3 中,如果我在单步调试时更改断点,我会得到 nginx 502 Bad Gateway

    我在 Docker 中运行 PHP 7 4 我能够很好地进行单步调试 但是 与 Xdebug v2 不同 如果我在单步调试时添加断点或删除断点 我会从 nginx 收到 502 Bad Gateway 消息 并且单步调试会话就会终止 我是否
  • 给定一组区间,找出有多少个区间包含一个点

    假设给你一组 N 个区间 表示为左右坐标 和 M 个点 对于每个点 P 算法应该找到 P 所属的区间数 这是我的算法 1 将区间的左 右坐标分别放入 left 和 right 数组中 2 左 排序 与 右 同时交换条目 3 给定一个点 P
  • OpenJDK 和 Adoptium/AdoptOpenJDK 之间的区别

    由于最近Oracle Java SE 支持路线图由于政策更新 特别是 2019 年 3 月之后 Oracle 的 free 版本更新结束 我一直在寻找 Oracle Java 的替代方案 我发现 OpenJDK 是一个开源替代品 我发现采用
  • 从 System.Drawing.Image 在文件系统上创建新图像?

    好吧 我很抱歉 这可能是一个菜鸟问题 但我有点卡住了 所以我正在做的 在我的 asp net 应用程序上 是从文件系统加载图像 System Drawing Image tempImage tempImage System Drawing
  • 如何在显示属性、名称字段中添加新行

    我正在开发 MVC3 应用程序 并使用数据属性作为屏幕上的显示名称字段 以下是一个代表性样本 Required Display Name Staff Id format 9999 StringLength 10 UIHint StaffId
  • Xcode 5“错误:无法执行‘codesign’(没有这样的文件或目录)”

    最近有人在以下位置发布了类似的问题无法执行 codesign 没有这样的文件或目录 然而 无论出于何种原因 它都收到了反对票 而不是有用的东西 因此 我将尝试自己发布此内容 并附上一些附加数据 希望某些 SO er 已经经历过此问题或只是知
  • React 嵌套映射/forEach 不起作用

    我正在开发一个 CMS 系统 其嵌套子菜单根据用户 自定义等而有所不同 为了解决这个问题 我在反应组件中放置了一个地图函数 根据文档 这种方法仅适用于一个嵌套地图功能 但显然不适用于第二个 这是我渲染子菜单所需的 有什么想法吗 render
  • 为什么我的声音使我的游戏在 Swift Spritekit 中出现滞后?

    当我的英雄节点收集硬币并且我的游戏中出现这个小问题时 我会听到这种声音效果 它不像其他游戏那样流畅 收集硬币时会发出声音 我究竟做错了什么 这是我的声音代码 class GameScene SKScene SKPhysicsContactD
  • iOS:管理 REST 端点的简单方法

    我们基于 REST 的应用程序可用于在多个内部环境上进行测试 每个内部环境都有不同的 REST 端点 有没有一种简单的方法可以在 iOS Swift 3 应用程序中设置环境级别配置 我见过一些方法 但它们似乎都非常复杂 这是当我们有多个端点
  • Java 交集类型与接口类和类型变量的限制

    今天 我尝试编写一个具有使用交集类型的泛型方法的类 但根据交集类型的不同错误消息而感到困惑 假设我们有一个interface and a class并在通用接口中定义通用方法 class ClassType interface Interf