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基礎】泛型Java泛型
- Java中的泛型方法Java泛型
- 【Java反射】Java 泛型基礎Java反射泛型
- TypeScript 交叉型別TypeScript型別
- java-基礎-泛型Java泛型
- 基礎篇:深入解析JAVA泛型和Type型別體系Java泛型型別
- 【java】【泛型】泛型geneticJava泛型
- java泛型之泛型方法。Java泛型
- Java中泛型的基礎到提高《精簡》Java泛型
- 型別 VS 泛型型別泛型
- TypeScript 泛型型別TypeScript泛型型別
- Java 中泛型的協變Java泛型
- Java 中泛型的全面解析Java泛型
- 深入解析Java中的泛型Java泛型
- Java泛型T與?的區別Java泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- Java 泛型,你瞭解型別擦除嗎?Java泛型型別
- Java中的泛型程式設計:深入理解型別引數與型別邊界的使用Java泛型程式設計型別
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 如何使用Java泛型對映不同的值型別Java泛型型別
- java泛型之泛型陣列。Java泛型陣列
- 泛型中的自限定型別泛型型別
- Java 泛型中? super T和? extends T的區別Java泛型
- Java基礎-泛型詳解Java泛型
- java基礎複習-----泛型Java泛型
- Java基礎之泛型方法Java泛型
- 泛型型別(.NET 指南)泛型型別
- Java 泛型Java泛型
- Java泛型Java泛型