Java中的Union Types和Intersection Types
前言
Union Type和Intersection Type都是将多个类型结合起来的一个等价的“类型”,它们并非是实际存在的类型。
Union Type
Union type(联合类型)使用比特或运算符|进行构造:
A | B | C
注意:用
|符号来构造Union Type类型只是Java语言的规定,|在这里不代表比特或的含义。
上例中,A | B | C是一个Union type,Union type的含义就是“或”,只要满足其中一个即可。
实例:捕获多个异常中的一个
try {
// ...
} catch (ExceptionA | ExceptionB e) {
}
就等价于:
try {
// ...
} catch (ExceptionA e) {
} catch (ExceptionB e) {
}
Intersection Type
Intersection type(交集类型)使用比特与运算符&进行:
A & B & C
Intersection type(交集类型),虽然名称翻译过来是“交集”,但是Intersection type并非数学上的交集含义。A & B & C的含义是:该交集类型兼具A、B、C的特征,相当于把A、B、C中每一个的相关成员都继承过来了
注意:在
Type1 & Type2 & Type3 & ... & Type n中,必须满足:至少有n-1个接口,如果有1个类必须放在一开始。
实例1:泛型类
class MyA {
}
interface MyB {
}
class Combination extends MyA implements MyB {
}
class MyC<T extends MyA & MyB> {
}
public class Test {
public static void main(String[] args) {
// new MyC<MyA & MyB>(); 报错, <>内不能用Intersection Type
new MyC<Combination>(); // OK
}
}
如何理解<T extends MyA & MyB>呢?可以将MyA & MyB等价为一个类型U,它兼具MyA和MyB的特征,因此可以将Combanation类作为MyC的类型参数。
实例2:对Lambda表达式进行强制类型转换
public class Test {
public static void main(String[] args) {
Runnable job =(Runnable & Serializable) () ->System.out.println("Hello");
Class[] interfaces = job.getClass().getInterfaces();
for (Class i : interfaces) {
System.out.println(i.getSimpleName());
}
}
}
/*
Runnable
Serializable
Java中的Union Types和Intersection Types的更多相关文章
- Java中的原始类型(Primitive Types)与引用类型(Reference Values)
Java虚拟机可以处理的类型有两种,一种是原始类型(Primitive Types),一种是引用类型(Reference Types). 与之对应,也存在有原始值(Primitive Values)和 ...
- Java中执行存储过程和函数(web基础学习笔记十四)
一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...
- Java中执行存储过程和函数
装载于:http://www.cnblogs.com/liunanjava/p/4261242.html 一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. Ca ...
- 【Java基础】Java中如何获取一个类中泛型的实际类型
泛型的术语 <>: 念做typeof List<E>: E称为类型参数变量 ArrayList<Integer>: Integer称为实际类型参数 ArrayLis ...
- Java 中的泛型详解-Java编程思想
Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的 ...
- 深入Java核心 Java中多态的实现机制(1)
在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...
- 个人对Java中多态的一些简单理解
什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...
- Java中 final static super this instanceof 关键字用法
一.final关键字 final可以修饰变量.方法及类: 1.当定义一个final变量时,jvm会将其分配到常量池中,其所修饰的对象只能赋值一次,对基本类型来说是其值不可变,引用类型(包括作为函数形参 ...
- Java中Enum类型的序列化(转)
在Java中,对Enum类型的序列化与其他对象类型的序列化有所不同,今天就来看看到底有什么不同.下面先来看下在Java中,我们定义的Enum在被编译之后是长成什么样子的. Java代码: Java代码 ...
随机推荐
- gamit安装
需要准备的文件: 默认已安装好虚拟机和Ubuntu系统 1.输入用户名密码,进入Ubuntu10.04桌面.按下“Ctrl+Alt+T”,进入终端: 2.在终端输入“sudo gedit /etc/a ...
- Hibernate事务、缓存和连接池
一.事务 1.数据库事务的概念 数据库事务是指由一个或多个SQL语句组成的工作单元,这个工作单元中的SQL语句相互依赖,如果有一个SQL语句执行失败,就必须撤销整个工作单元.在并发环境中,多个事务同时 ...
- 1305. [CQOI2009]跳舞【最大流+二分】
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- 【openjudge】【字符串】P6374文字排版
[描述] 给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻的标点符号).请将短文重新排版,要求如下: 每行不超过80个字符:每个单词居于同一行上:在同一行的单词之间以一个空格分隔:行首和行尾 ...
- Ubuntu14.04更换阿里云源
步骤很简单一共三步,如下所示: 第一.备份源文件(防止万一) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 第二.修改源文件(这里的源 ...
- 简单说说Vue
Vue.js是这次我们公司迭代项目使用的前端框架之一.我们前端使用的是一个叫Metronic的.Metronic的可以说是bootstrap系列的集合. 当然也用到一个叫layui的,layui的话就 ...
- mybatis提取<where><if>共用代码
mybatis项目dao层中很多sql语句都会拥有某些相同的查询条件,以<where><if test=""></if></where&g ...
- java的重载 和重写
请看如下代码: 父类: public class FU { public void show(){ System.out.println("this is fu!"); } } 子 ...
- P2049 魔术棋子
题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod ...
- JQuery Validate插件与实现
菜鸟拙见,望请纠正 一:效果展示:以下是两个注册表单验证,左边使用Jquery validate插件实现,右边是自己用JQuery实现,效果差不多,但个人推荐用插件,毕竟前人栽了树而且长大了后人当然好 ...