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代码 ...
随机推荐
- SDN 第一次上机作业
第一题 拓扑: 测试连通性: 第二题 拓扑: 测试连通性: 第三题 拓扑: 测试连通性:
- 1483. [HNOI2009]梦幻布丁【平衡树-splay】
Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input ...
- Yii设置Cache缓存的方法
先在配置文件components数组中加上: 'cache'=>array( 'class'=>'CFileCache'), 设置Cache: Yii::app()->cache-& ...
- HBase学习之路 (二)HBase集群安装
前提 1.HBase 依赖于 HDFS 做底层的数据存储 2.HBase 依赖于 MapReduce 做数据计算 3.HBase 依赖于 ZooKeeper 做服务协调 4.HBase源码是java编 ...
- Codeforces 1133 F2. Spanning Tree with One Fixed Degree 并查集+生成树
好久没更新博客了,一直懒得动,这次更新一下. 题意大概是:给出一个图,求它的一个一号节点的度数恰好为D的生成树的方案. 一开始随便水了个乱搞贪心,不出意外并没有过. 仔细思考之后,对于这个问题我们可以 ...
- Robot Framework自动化测试---Selenium API
一.浏览器驱动 通过不同的浏览器执行脚本. Open Browser Htpp://www.xxx.com chrome 浏览器对应的关键字: firefox FireFox ff internete ...
- Python之括号()[]{}
Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示.如:字典:dic={'a':12,'b':34}列表:list=[1,2,3,4]元组:tup=(1,2,3,4)
- 【转】Tomcat 9.0安装配置
本文转自:http://blog.sina.com.cn/s/blog_15126e2170102w5o8.html 一.JDK的安装与配置 1.从官网下载jdk,注意是jdk不是jre.最好从官网下 ...
- Spring源码分析(二十一)加载BeanFactory
摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.定制化BeanFactory 二.加载BeanDefinit ...
- B. Our Tanya is Crying Out Loud
http://codeforces.com/problemset/problem/940/B Right now she actually isn't. But she will be, if you ...