资讯专栏INFORMATION COLUMN

Java™ 教程(泛型、继承和子类型)

AaronYuan / 1652人阅读

泛型、继承和子类型

如你所知,只要类型兼容,就可以将一种类型的对象分配给另一种类型的对象,例如,你可以将Integer分配给Object,因为ObjectInteger的超类型之一:

Object someObject = new Object();
Integer someInteger = new Integer(10);
someObject = someInteger;   // OK

在面向对象的术语中,这被称为“是一种”关系,由于Integer是一种Object,因此允许赋值,但是Integer也是一种Number,所以下面的代码也是有效的:

public void someMethod(Number n) { /* ... */ }

someMethod(new Integer(10));   // OK
someMethod(new Double(10.1));   // OK

泛型也是如此,您可以执行泛型类型调用,将Number作为其类型参数传递,如果参数与Number兼容,则允许任何后续的add调用:

Box box = new Box();
box.add(new Integer(10));   // OK
box.add(new Double(10.1));  // OK

现在考虑以下方法:

public void boxTest(Box n) { /* ... */ }

它接受什么类型的参数?通过查看其签名,你可以看到它接受一个类型为Box的参数,但是,这是什么意思?你是否可以按照预期传递BoxBox?答案是“否”,因为BoxBox不是Box的子类型。

在使用泛型编程时,这是一个常见的误解,但这是一个重要的学习概念。

给定两个具体类型AB(例如,NumberInteger),MyClassMyClass无关,无论AB是否相关,MyClassMyClass的公共父级是Object

有关如何在类型参数相关时在两个泛型类之间创建类似子类型关系的信息,请参阅通配符和子类型。

泛型类和子类型

你可以通过扩展或实现泛型类或接口来对其进行子类型化,一个类或接口的类型参数与另一个类或接口的类型参数之间的关系由extendsimplements子句确定。

使用Collections类作为示例,ArrayList implements ListList extends Collection,因此ArrayListList的子类型,也是Collection的子类型,只要不改变类型参数,就会在类型之间保留子类型关系。

现在假设我们想要定义我们自己的列表接口PayloadList,它将泛型类型P的可选值与每个元素相关联,它的声明可能如下:

interface PayloadList extends List {
  void setPayload(int index, P val);
  ...
}

PayloadList的以下参数化是List的子类型:

PayloadList

PayloadList

PayloadList

上一篇:有界类型参数 下一篇:类型推断

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72920.html

相关文章

  • Java教程(目录)

    Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...

    lifesimple 评论0 收藏0
  • Java 泛型之上界下界通配符

    摘要:泛型之上界下界通配符本教程是为编写的。这是在使用泛型编程时一个常见的误解,也是一个需要学习的重要概念。通配符使用指南学习使用泛型编程时,更令人困惑的一个方面是确定何时使用上限有界通配符以及何时使用下限有界通配符。 Java 泛型之上界下界通配符 本Java教程是为JDK 8编写的。本页描述的示例和实践没有利用后续版本中引入的改进。 泛型,继承和子类 如你所知,只要类型兼容,就可以将一种...

    shiyang6017 评论0 收藏0
  • Java教程类型推断)

    类型推断 类型推断是Java编译器查看每个方法调用和相应声明的能力,以确定使调用适用的类型参数,推理算法确定参数的类型,如果可用,还确定分配或返回结果的类型,最后,推理算法尝试查找适用于所有参数的最具体类型。 为了说明最后一点,在下面的示例中,推断确定传递给pick方法的第二个参数是Serializable类型: static T pick(T a1, T a2) { return a2; } ...

    JerryC 评论0 收藏0
  • Java教程(有界类型参数)

    有界类型参数 有时你可能希望限制可用作参数化类型中的类型参数的类型,例如,对数字进行操作的方法可能只想接受Number或其子类的实例,这是有界类型参数的用途。 要声明有界类型参数,请列出类型参数的名称,然后是extends关键字,后跟其上限,在此示例中为Number,请注意,在此上下文中,extends在一般意义上用于表示extends(如在类中)或implements(如在接口中)。 publi...

    spacewander 评论0 收藏0
  • 【从基础学 Java泛型

    摘要:泛型方法泛型类中可以定义静态非静态的泛型方法。上述泛型类会被替换成下面形式一般使用第一个限定类型替换变为原始类型,没有限定类型,使用替换。 引言 在面向对象的世界里,我们如果需要一个容器来盛装对象。举个例子:一个篮子。我们可以用这个篮子装苹果,也可以用这个篮子装香蕉。基于 OOP 的思想,我们不希望为苹果和香蕉分别创建不同的篮子;同时,我们希望放进篮子里的是苹果,拿出来的还是苹果。于是...

    huhud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<