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