Java中基於泛型的交叉型別 - {4Comprehension}
簡單地說,交集型別是通過組合至少兩種不同型別而建立的匿名型別的形式。
想象一下,我們需要模擬兩種型別的動物:
- 那些可以飛的
- 那些可以游泳的
我們可以簡單地實現兩個介面:
class SailfinFlyingfish implements Swimmable, Flyable { @Override public void fly() { System.out.println("*flap flap*"); } @Override public void swim() { System.out.println("*swim swim*"); } } |
但是,如果我們想要建立一種只接受可以游泳和飛行的動物的方法呢?
public static void process(... animal) { animal.fly(); animal.swim(); } |
變通方式是引入合成介面:
interface FlyableAndSwimmable extends Flyable, Swimmable { } |
但這涉及相當多額外的樣板程式碼,也不是很有彈性,但至少是型別安全的。
基於泛型的交叉型別(intersection type)
我們可以在定義泛型型別變數時使用該語法:
public static <T extends Flyable & Swimmable> void process(T animal) { animal.fly(); animal.swim(); } |
Java語言規範:
交叉型別採用T1&...&Tn(n> 0)的形式,其中Ti(1≤i≤n)是型別。
An intersection type takes the form T1 & … & Tn (n > 0), where Ti (1 ≤ i ≤ n) are types.
它可能看起來像一個基於泛型的黑客,但它實際上是一個完全成熟的合法Java功能 - 只是以一種有趣的方式實現。
通過利用這種語法,我們最終得到了一個型別安全和無樣板解決方案。
自JDK10起
在JDK10之前,該方法只能在使用泛型型別引數時使用,但自從引入區域性變數型別推理以來,我們可以在區域性變數級別執行相同的操作:
var action = (Function<Integer, Integer> & Serializable) i -> i + 1; |
相關文章
- Java中建立泛型型別的例項Java泛型型別
- JAVA基礎之九-泛型(通用型別)Java泛型型別
- Java™ 教程(泛型原始型別)Java泛型型別
- Java中的泛型Java泛型
- Java泛型型別擦除問題Java泛型型別
- java 基礎 泛型Java泛型
- Java基礎-泛型Java泛型
- Java基礎 —— 泛型Java泛型
- Java中的泛型方法Java泛型
- 【java】【泛型】泛型geneticJava泛型
- 【Java反射】Java 泛型基礎Java反射泛型
- 基礎篇:深入解析JAVA泛型和Type型別體系Java泛型型別
- TypeScript 交叉型別TypeScript型別
- Java泛型T與?的區別Java泛型
- TypeScript 泛型型別TypeScript泛型型別
- 型別 VS 泛型型別泛型
- Java 泛型,你瞭解型別擦除嗎?Java泛型型別
- 深入解析Java中的泛型Java泛型
- Java中的泛型程式設計:深入理解型別引數與型別邊界的使用Java泛型程式設計型別
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- Java基礎-泛型詳解Java泛型
- Java基礎之泛型方法Java泛型
- java基礎複習-----泛型Java泛型
- 泛型型別(.NET 指南)泛型型別
- Java泛型Java泛型
- Java中泛型的詳細解析,深入分析泛型的使用方式Java泛型
- java泛型中<?>和<T>有什麼區別?Java泛型
- typeScript 型別斷言、聯合型別和交叉型別(七)TypeScript型別
- Java 泛型中易混淆的地方Java泛型
- Java 泛型中的萬用字元Java泛型字元
- Java 中的泛型方法及 FunctionJava泛型Function
- Java基礎——深入理解泛型Java泛型
- Java基礎之淺談泛型Java泛型
- TypeScript 基本型別和泛型的使用TypeScript型別泛型
- 夯實Java基礎系列13:深入理解Java中的泛型Java泛型
- 關於泛型泛型
- Java 中的泛型 集合(List,Set) MapJava泛型
- Java 泛型原理Java泛型