泛型超级与扩展

2023-11-29

正当我以为我终于理解了泛型时,我遇到了以下示例:

public class Organic<E> {
          void react(E e) { }
          static void main(String[] args) {
            //1: Organic<? extends Organic> compound = new Aliphatic<Organic>(); 
            //2: Organic<? super Aliphatic> compound = new Aliphatic<Organic>(); 
           compound.react(new Organic());
           compound.react(new Aliphatic());
           compound.react(new Hexane());
 } }
 class Aliphatic<F> extends Organic<F> { }
 class Hexane<G> extends Aliphatic<G> { }

它表示,如果第 1 行未注释,则以下内容将无法编译:

  compound.react(new Organic());  
  compound.react(new Aliphatic());  
  compound.react(new Hexane());

而如果第 2 行被取消注释,则以下内容将无法编译:

compound.react(new Organic());

在第二个示例中,允许使用脂肪族及其超类型。那么为什么不允许脂肪族呢?

在第一个例子中,为什么不是new Organic允许??

第一个编译器错误:

- The method react(capture#1-of ? extends Organic) in the type Organic<capture#1-of ? extends Organic> is not applicable for the arguments (Organic)
- The method react(capture#2-of ? extends Organic) in the type Organic<capture#2-of ? extends Organic> is not applicable for the arguments (Aliphatic)
- The method react(capture#3-of ? extends Organic) in the type Organic<capture#3-of ? extends Organic> is not applicable for the arguments (Hexane)

第二个编译器错误:

- The method react(capture#1-of ? super Aliphatic) in the type Organic<capture#1-of ? super Aliphatic> is not applicable for the arguments  (Organic)

您的第一份声明

Organic<? extends Organic> compound

意思是compound could be an Organic<SomeSubtypeOfHexane> (since Aliphatic延伸Organic, Hexane延伸Aliphatic and SomeSubtypeOfHexane延伸Hexane).

在这种情况下,compound.react(new Organic()), compound.react(new Aliphatic()) and compound.react(new Hexane())会导致类型错误,因为E in compound必须是一个SomeSubtypeOfHexane(或其子类型)。


您的第二次声明

Organic<? super Aliphatic> compound

意思是compount could be an Organic<Aliphatic>.

在这种情况下compound.react(new Organic())会导致类型错误,因为E必须是一个Aliphatic(或其子类型)。


请记住,使用声明变量A<? extends B> or A<? super B>

  • extends可以分配给它的对象数量,因此,
  • 限制可以用该变量做什么。

由于类的确切类型是未知的(只有一个约束已知),编译器必须在安全方面犯错误,并禁止某些非协变或逆变的操作。 (如果你还不熟悉它,协变和逆变是这些类型的仿制药的科学背景。)

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

泛型超级与扩展 的相关文章

随机推荐

  • Apache Spark 不会删除临时目录

    Spark程序完成后 temp目录中保留3个临时目录 目录名称如下 spark 2e389487 40cc 4a82 a5c7 353c0feefbb7 目录是空的 当Spark程序在Windows上运行时 临时目录中还会保留一个snapp
  • 如何在角度时刻选择器中将今天的日期和时间设置为默认值

    我正在使用日期时间选择器的角度矩选择器输入 并且我想在输入上设置今天的日期和当前时间 这是我的源代码 你能帮我么 谢谢
  • 未使用 Office Addin 设置打开的 xml 标头

    我正在查看这个 非常好 文档 http dev office com docs add ins word create better add ins for word with office open xml product word 更好
  • Jquery .keypress 动态添加的输入

    我当前正在通过 click 事件添加输入 然后想要监听此输入上发生的任何按键 但是 附加内容在插入后不会触发任何事件 即模糊 按键 焦点 有没有人有什么建议 提前致谢 recipientsDiv click function this ap
  • YouTube:像 Facebook 一样获取 YouTube 标题+图像+描述

    当你将 YouTube 链接粘贴到 你现在在做什么 时 他们是如何做到这一点的呢 然后在链接中出现youtube图片 标题 描述 他们是如何做到这一点的 这很难吗 这样做的例子会很棒 Facebook 中的识别适用于大多数链接 而不仅仅是来
  • 使用显卡代替 GDI+ 进行图像操作

    我有一个问题 这可能是一个白日梦 但我想知道我的 Stack Overflow 同伴是否可以帮助我 在我工作的公司 我们这样做billions每月的图像处理次数 基本上 我们拍摄一张巨大的图像 将其切成 256 像素的方形图像 对它们进行颜
  • Mongoose 架构:如何设置数组中的最大项目数?

    我有一个猫鼬模式 其中包含一个对象数组和一个字符串数组 在这两种情况下 如何设置验证器以将可以插入的项目数量限制为 10 个 todoList type String pictures type String 没有默认值maxlength数
  • 如何删除带孔多边形上的顶点(节点)(Google 地图 V3)

    我从以下位置获取了这个示例 解决方案 伊恩 格兰杰 但我添加了一个带内孔的多边形 这个例子对于外部顶点路径工作正常 但对于内部顶点路径则不行 我需要为内部和外部节点实现事件监听器 因为在内部顶点发生火灾事件时 删除外部顶点 效果不太好 有人
  • Case 语句 - 根据条件值隐藏/取消隐藏

    如果 case 值为 否 我会尝试隐藏一列 我将其保存在工作表中 而不是模块中 Private Sub Worksheet Change ByVal Target As Range ActiveSheet Activate If Not A
  • 将用户的键盘输入过滤到 JTextField (swing)

    如何在输入 JTextField 之前限制键盘输入 swing 我只想允许用户输入 0123456789abcdef 个字符 且不超过 1 个 or char 我的 JTextField 是单行输入字段 thanks 您可以通过以下方式实现
  • 为什么我们需要 SqlCeCommand.Parameters.AddWithValue() 来插入值?

    我有一个 C WPF 桌面应用程序 它使用 SQL Compact 3 5 作为其嵌入式数据库 在插入函数中有 using SqlCeCommand com new SqlCeCommand INSERT INTO FooTable VAL
  • 我可以根据字段的值获取枚举吗?

    我想根据其字段值获取特定的枚举 Enum public enum CrimeCategory ASBO Anti Social Behaviour BURG Burglary CRIMDAM Criminal Damage And Arso
  • Python 优雅的 int(string,base) 逆函数

    Python 允许使用 2 36 范围内的任何基数从字符串转换为整数 使用 int string base 我正在寻找一个优雅的反函数 它接受一个整数和一个基数并返回一个字符串 例如 gt gt gt str base 224 15 ee
  • Python从父级子文件夹导入

    我有个问题 我有一个这样的目录设置 folder main py stuff init py function py items init py class py 我的问题是如何将 class py 导入到 function py 中 此设
  • Android 中的嵌套形状

    我正在尝试绘制一个具有三个矩形的形状 纯色 gradient 白线 我怎么做 当我尝试这个时 它不起作用 布局具有父颜色
  • 单击时 WPF 按钮闪烁为白色

    我刚刚创建了 wpf 按钮 当我单击该按钮时 它会像闪烁一样变为白色 并在释放按钮时变回原始颜色 可能是什么问题呢 我没有使用任何效果 下面是我的按钮 xaml 请指教
  • 将 404 错误页面重定向到 Tomcat 中 Spring MVC Web 应用程序的自定义页面

    我正在使用 tomcat 7 并且在 tomcat 7 中构建并部署了 Spring MVC web 应用程序 并且它工作得非常好 我想要的是 每当我的服务器上发生 404 错误时 它应该被重定向到我在 web 应用程序中构建的自定义页面
  • openGL glx.h 缺少 xcode 4 mac lion 形式

    我正在尝试设置一个示例项目 它使用 GLSDK 我使用 premake 设置它 将项目基础 sdk 设置为 10 6 因为我使用的是 xcode 4 但是当我尝试编译时 我从示例文件中得到 GL gl h not found 因此 我手动添
  • ASM:“cmp”的操作数类型不匹配

    我正在执行 x86 汇编代码 并且不断收到此错误 cmp 的操作数类型不匹配 它出现的代码行是 cmpb rdi 0 在 AT T 语法 您使用的语法 中 指令有一个尺寸后缀来指示操作数的大小 尺寸后缀为 b byte 1 bytes w
  • 泛型超级与扩展

    正当我以为我终于理解了泛型时 我遇到了以下示例 public class Organic