91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java泛型構造函數有哪些

發布時間:2021-11-19 15:55:58 來源:億速云 閱讀:255 作者:iii 欄目:編程語言

本篇內容介紹了“Java泛型構造函數有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.概述

我們之前討論過Java Generics的基礎知識。在本文中,我們將了解Java中的通用構造函數。泛型構造函數是至少需要有一個泛型類型參數的構造函數。我們將看到泛型構造函數并不都是在泛型類中出現的,而且并非所有泛型類中的構造函數都必須是泛型。

2.非泛型類

首先,先寫一個簡單的類:Entry,它不是泛型類:

public class Entry {private String data;private int rank;}

在這個類中,我們將添加兩個構造函數:一個帶有兩個參數的基本構造函數和一個通用構造函數。

2.1 基本構造器

Entry第一個構造函數:帶有兩個參數的簡單構造函數:

public Entry(String data, int rank) {this.data = data;this.rank = rank;}

現在,讓我們使用這個基本構造函數來創建一個Entry對象

@Testpublic void givenNonGenericConstructor_whenCreateNonGenericEntry_thenOK() {Entry entry = new Entry("sample", 1);assertEquals("sample", entry.getData());assertEquals(1, entry.getRank());}

2.2 泛型構造器

接下來,第二個構造器是泛型構造器:

public <E extends Rankable & Serializable> Entry(E element) {this.data = element.toString();this.rank = element.getRank();}

雖然Entry類不是通用的,但它有一個參數為E的泛型構造函數。

泛型類型E是受限制的,應該實現Rankable和Serializable接口。

現在,讓我們看看Rankable接口,下面是其中一個方法:

public interface Rankable {public int getRank();}

假設我們有一個實現Rankable接口的類——Product

public class Product implements Rankable, Serializable {private String name;private double price;private int sales;public Product(String name, double price) {this.name = name;this.price = price;}@Overridepublic int getRank() {return sales;}}

然后我們可以使用泛型構造函數和Product創建Entry對象:

@Testpublic void givenGenericConstructor_whenCreateNonGenericEntry_thenOK() {Product product = new Product("milk", 2.5);product.setSales(30);Entry entry = new Entry(product);assertEquals(product.toString(), entry.getData());assertEquals(30, entry.getRank());}

3.泛型類

接下來,我們看一下泛型類:GenericEntry

public class GenericEntry<T> {private T data;private int rank;}

我們將在此類中添加與上一節相同的兩種類型的構造函數。

3.1 基礎構造器

首先,讓我們為GenericEntry類編寫一個簡單的非泛型構造函數:

public GenericEntry(int rank) {this.rank = rank;}

盡管GenericEntry是泛型類,但這是一個簡單的,沒有任何參數的構造函數。現在,我們可以使用此構造函數來創建GenericEntry:

@Testpublic void givenNonGenericConstructor_whenCreateGenericEntry_thenOK() {GenericEntry<String> entry = new GenericEntry<String>(1);assertNull(entry.getData());assertEquals(1, entry.getRank());}

3.2 泛型構造器

接下來,在類中添加第二個構造函數:

public GenericEntry(T data, int rank) {this.data = data;this.rank = rank;}

這是一個泛型構造函數,它有一個泛型類型T的數據參數。注意,我們不需要在構造函數聲明中添加,因為它是隱含的。現在,讓我們測試一下通用構造函數:

@Testpublic void givenGenericConstructor_whenCreateGenericEntry_thenOK() {GenericEntry<String> entry = new GenericEntry<String>("sample", 1);assertEquals("sample", entry.getData());assertEquals(1, entry.getRank()); }

4.不同類型的泛型構造函數

在泛型類中,還有一個構造函數,其泛型類型與類的泛型類型不同:

public <E extends Rankable & Serializable> GenericEntry(E element) {this.data = (T) element;this.rank = element.getRank();}

GenericEntry構造函數有類型為E的參數,該參數與T類型不同。讓我們看看它的實際效果:

@Testpublic void givenGenericConstructorWithDifferentType_whenCreateGenericEntry_thenOK() {Product product = new Product("milk", 2.5);product.setSales(30);GenericEntry<Serializable> entry = new GenericEntry<Serializable>(product);assertEquals(product, entry.getData());assertEquals(30, entry.getRank());}

注意:在示例中,我們使用Product(E)創建Serializable(T)類型的GenericEntry,只有當類型E的參數可以轉換為T時,我們才能使用此構造函數。

5.多種泛類型

接下來,我們有兩個泛型類型參數的泛型類MapEntry:

public class MapEntry<K, V> {private K key;private V value;public MapEntry(K key, V value) {this.key = key;this.value = value;}}

MapEntry有一個兩個參數的泛型構造函數,每個參數都是不同的類型。讓我們用一個簡單的單元測試測試一下:

@Testpublic void givenGenericConstructor_whenCreateGenericEntryWithTwoTypes_thenOK() {MapEntry<String,Integer> entry = new MapEntry<String,Integer>("sample", 1);assertEquals("sample", entry.getKey());assertEquals(1, entry.getValue().intValue()); }

6.通配符

最后,我們可以在泛型構造函數中使用通配符:

public GenericEntry(Optional<? extends Rankable> optional) {if (optional.isPresent()) {this.data = (T) optional.get();this.rank = optional.get().getRank();}}

在這兒,我們在GenericEntry構造函數中使用通配符來綁定Optional類型:

@Testpublic void givenGenericConstructorWithWildCard_whenCreateGenericEntry_thenOK() {Product product = new Product("milk", 2.5);product.setSales(30);Optional<Product> optional = Optional.of(product);GenericEntry<Serializable> entry = new GenericEntry<Serializable>(optional);assertEquals(product, entry.getData());assertEquals(30, entry.getRank());}

請注意,我們應該能夠將可選參數類型(Product示例)轉換為GenericEntry類型(Serializable示例)。

“Java泛型構造函數有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆元县| 陆丰市| 岳阳县| 壶关县| 南乐县| 咸阳市| 安塞县| 城口县| 浦北县| 尤溪县| 太保市| 象州县| 公安县| 成武县| 都安| 阆中市| 呼玛县| 黔西县| 阳谷县| 卢氏县| 新河县| 英山县| 博湖县| 凤城市| 泸西县| 苗栗市| 津南区| 北安市| 克什克腾旗| 新乡市| 常山县| 罗山县| 海宁市| 如皋市| 梨树县| 岫岩| 新竹市| 旬邑县| 兴业县| 定远县| 凤翔县|