博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java™ 教程(泛型、继承和子类型)
阅读量:6982 次
发布时间:2019-06-27

本文共 1530 字,大约阅读时间需要 5 分钟。

泛型、继承和子类型

如你所知,只要类型兼容,就可以将一种类型的对象分配给另一种类型的对象,例如,你可以将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));   // OKsomeMethod(new Double(10.1));   // OK

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

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

现在考虑以下方法:

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

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

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

generics-subtypeRelationship.gif

给定两个具体类型
A
B(例如,
Number
Integer),
MyClass<A>
MyClass<B>无关,无论
A
B是否相关,
MyClass<A>
MyClass<B>的公共父级是
Object

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

泛型类和子类型

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

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

generics-sampleHierarchy.gif

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

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

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

  • PayloadList<String,String>
  • PayloadList<String,Integer>
  • PayloadList<String,Exception>

generics-payloadListHierarchy.gif


转载地址:http://eatpl.baihongyu.com/

你可能感兴趣的文章
vue.js+vscode+visual studio在windows下搭建开发环境
查看>>
puppet 基础篇
查看>>
Java开发GUI之Dialog弹出窗口
查看>>
云架构的基础转变会带来哪些变化?
查看>>
如何将视频下载并且转码拼接
查看>>
Alcatraz插件安装问题
查看>>
轻松了解“Web应用防火墙”
查看>>
Kubernetes基础文档(链接,下载,安装,架构)
查看>>
PEEK材料再获突破,对3D打印产业影响几何
查看>>
无线加速度传感器
查看>>
设计模式
查看>>
Zend Studio 0x80070666错误解决
查看>>
Mac应用程序无法打开或文件损坏的处理方法
查看>>
网址被微信拦截怎么办 微信屏蔽的域名如何正常访问
查看>>
@ModelAttribute运用详解
查看>>
思科交换机VTP配置
查看>>
正则表达式
查看>>
Mysql中使用命令行导入.sql文件新建数据库表(图文)
查看>>
RUBY有感
查看>>
spring 配置多数据源
查看>>