当前位置: 首页 > 面试题库 >

通用通配符实例化

傅啸
2023-03-14
问题内容

前几天,我正在查看别人的代码,遇到了引起关注的一行。为简化起见,假设我有一个通用的A类和一个抽象的B类。是否允许以下​​实例化?如果可以,为什么?

Object obj = new A<? extends B>();

我个人从未见过像上面这样的实例化,尽管有这样的声明:

A<? extends B> obj = null;

肯定会成立。我一直在泛型中使用通配符声明方法参数,所以我可能没有经验。


问题答案:

其实new A<? extends B>()不编译。自Java 5以来,它一直是非法的。

但是我想你原来的例子是这样的new A<X<? extends B>>()。后者在Java的最新版本中是合法的。

这个想法是,当实例化一个对象时,类型参数的值可以是任何非通配符类型。? extends B是通配符类型,因此不允许使用。但X<? extends B>不是通配符类型,尽管它 具有 通配符类型作为组件。因此,您可以说合法通话new A<X<? extends B>>()

如果您以这种方式考虑,则规则是有意义的。最终,它是更基本的规则的副产品,即通配符类型(例如)? extends B不能是字段或变量的 声明
类型。如果A定义为

class A<T> {
    T value;
}

那么假设new A<? extends B>().value将是一个 声明为type 的字段? extends B。由于那是非法的,因此实例化也是如此。但是new A<X<? extends B>>()没有那个问题。



 类似资料:
  • 你好,我正在尝试。我把我的类定义为: 它也被用于其他课程,如: 现在,在我的模块文件()中,我将Foo定义为: 现在,当我运行代码时,GoogleGuice能够找到

  • Bucket 和 主机名 有两种不同的方式访问 bucket。第一个(首选)方法通过URI中的顶级目录 来确认 bucket 。 GET /mybucket HTTP/1.1 Host: cname.domain.com 第二种方法是通过虚拟的bucket 主机名来确认 bucket。举例如下: GET / HTTP/1.1 Host: mybucket.cname.domain.com Tip

  • 本文向大家介绍Python 通配符删除文件的实例,包括了Python 通配符删除文件的实例的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 以上这篇Python 通配符删除文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • “帮助系统”一节 脱字符 Shell 中的一些功能是通过特殊符号作为控制字符来实现的,上面已经介绍了很多了。这产生一个问题,如果一个文件名中,刚好包含了这些字符,比如 ; ,就很难对它进行操作。使用 less 浏览这个文件 less ;xxx less 会很快返回一个错误信息,因为并没有一个文件名作为操作对象。接着,Shell 会报告,系统中没有 xxx 这个命令。 这是因为 Shell

  • 本文向大家介绍SQL 通配符,包括了SQL 通配符的使用技巧和注意事项,需要的朋友参考一下 示例 通配符与SQL LIKE运算符一起使用。SQL通配符用于在表中搜索数据。 SQL中的通配符为:%,_,[charlist],[^ charlist] % -零个或多个字符的替代 _-代替单个字符 [charlist] -匹配的字符集和范围 [^ charlist] -仅匹配括号中未指定的字符    

  • XPath在要与XPath表达式一起使用的节点上定义以下通配符。 序号 通配符 描述 1 用于匹配任何节点。 2 用于匹配上下文中的当前节点。 3 用于匹配任何属性。 4 用于匹配任何类型的节点。 示例 此示例通过迭代每个学生创建一个包含其详细信息的元素。 文件:students.xml - 文件:students.xsl - 使用浏览器打开上面文件:student.xsl,显示效果如下所示 -