有界類型參數
有時你可能希望限制可用作參數化類型中的類型參數的類型,例如,對數字進行操作的方法可能只想接受Number或其子類的實例,這是有界類型參數的用途。
要聲明有界類型參數,請列出類型參數的名稱,然后是extends關鍵字,后跟其上限,在此示例中為Number,請注意,在此上下文中,extends在一般意義上用于表示“extends”(如在類中)或“implements”(如在接口中)。
public class Box{ private T t; public void set(T t) { this.t = t; } public T get() { return t; } public void inspect(U u){ System.out.println("T: " + t.getClass().getName()); System.out.println("U: " + u.getClass().getName()); } public static void main(String[] args) { Box integerBox = new Box (); integerBox.set(new Integer(10)); integerBox.inspect("some text"); // error: this is still String! } }
通過修改我們的泛型方法來包含這個有界類型參數,編譯現在將失敗,因為我們的inspect調用仍然包含一個String:
Box.java:21: inspect(U) in Boxcannot be applied to (java.lang.String) integerBox.inspect("10"); ^ 1 error
除了限制可用于實例化泛型類型的類型之外,有界類型參數還允許你調用邊界中定義的方法:
public class NaturalNumber{ private T n; public NaturalNumber(T n) { this.n = n; } public boolean isEven() { return n.intValue() % 2 == 0; } // ... }
isEven方法通過n調用Integer類中定義的intValue方法。
多個邊界前面的示例說明了使用帶有單個邊界的類型參數,但是類型參數可以有多個邊界:
具有多個邊界的類型變量是邊界中列出的所有類型的子類型,如果其中一個邊界是類,則必須首先指定它,例如:
Class A { /* ... */ } interface B { /* ... */ } interface C { /* ... */ } class D{ /* ... */ }
如果未首先指定邊界A,則會出現編譯時錯誤:
class D泛型方法和有界類型參數{ /* ... */ } // compile-time error
有界類型參數是通用算法實現的關鍵,請考慮以下方法,該方法計算數組T[]中大于指定元素elem的元素數。
public staticint countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray) if (e > elem) // compiler error ++count; return count; }
該方法的實現很簡單,但它不能編譯,因為大于運算符(>)僅適用于基本類型,如short、int、double、long、float、byte和char,你不能使用>運算符來比較對象,要解決此問題,請使用由Comparable
public interface Comparable{ public int compareTo(T o); }
生成的代碼將是:
public static上一篇:泛型方法 下一篇:泛型、繼承和子類型> int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray) if (e.compareTo(elem) > 0) ++count; return count; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72923.html
類型擦除 泛型被引入到Java語言中,以便在編譯時提供更嚴格的類型檢查并支持通用編程,為了實現泛型,Java編譯器將類型擦除應用于: 如果類型參數是無界的,則用它們的邊界或Object替換泛型類型中的所有類型參數,因此,生成的字節碼僅包含普通的類、接口和方法。 如有必要,插入類型轉換以保持類型安全。 生成橋接方法以保留擴展泛型類型中的多態性。 類型擦除確保不為參數化類型創建新類,因此,泛型不會...
Queue接口 Queue是在處理之前保存元素的集合,除了基本的Collection操作外,隊列還提供額外的插入、刪除和檢查操作,Queue接口如下。 public interface Queue extends Collection { E element(); boolean offer(E e); E peek(); E poll(); E remov...
泛型、繼承和子類型 如你所知,只要類型兼容,就可以將一種類型的對象分配給另一種類型的對象,例如,你可以將Integer分配給Object,因為Object是Integer的超類型之一: Object someObject = new Object(); Integer someInteger = new Integer(10); someObject = someInteger; // OK ...
泛型方法 泛型方法是引入其自己的類型參數的方法,這類似于聲明泛型類型,但類型參數的范圍僅限于聲明它的方法,允許使用靜態和非靜態泛型方法,以及泛型類構造函數。 泛型方法的語法包括類型參數列表,在尖括號內,它出現在方法的返回類型之前,對于靜態泛型方法,類型參數部分必須出現在方法的返回類型之前。 Util類包含一個泛型方法compare,它比較兩個Pair對象: public class Util { ...
摘要:泛型之上界下界通配符本教程是為編寫的。這是在使用泛型編程時一個常見的誤解,也是一個需要學習的重要概念。通配符使用指南學習使用泛型編程時,更令人困惑的一個方面是確定何時使用上限有界通配符以及何時使用下限有界通配符。 Java 泛型之上界下界通配符 本Java教程是為JDK 8編寫的。本頁描述的示例和實踐沒有利用后續版本中引入的改進。 泛型,繼承和子類 如你所知,只要類型兼容,就可以將一種...
閱讀 3430·2023-04-25 22:44
閱讀 940·2021-11-15 11:37
閱讀 1642·2019-08-30 15:55
閱讀 2654·2019-08-30 15:54
閱讀 1091·2019-08-30 13:45
閱讀 1439·2019-08-29 17:14
閱讀 1862·2019-08-29 13:50
閱讀 3419·2019-08-26 11:39