真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

不同Java泛型構(gòu)造函數(shù)的示例分析

這篇文章主要介紹不同Java泛型構(gòu)造函數(shù)的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯(lián)是一家專業(yè)提供巴南企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為巴南眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

1.概述

泛型構(gòu)造函數(shù)是至少需要有一個(gè)泛型類型參數(shù)的構(gòu)造函數(shù)。我們將看到泛型構(gòu)造函數(shù)并不都是在泛型類中出現(xiàn)的,而且并非所有泛型類中的構(gòu)造函數(shù)都必須是泛型。

2.非泛型類

首先,先寫一個(gè)簡(jiǎn)單的類:Entry,它不是泛型類:

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

在這個(gè)類中,我們將添加兩個(gè)構(gòu)造函數(shù):一個(gè)帶有兩個(gè)參數(shù)的基本構(gòu)造函數(shù)和一個(gè)通用構(gòu)造函數(shù)。

2.1 基本構(gòu)造器

Entry第一個(gè)構(gòu)造函數(shù):帶有兩個(gè)參數(shù)的簡(jiǎn)單構(gòu)造函數(shù):

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

現(xiàn)在,讓我們使用這個(gè)基本構(gòu)造函數(shù)來創(chuàng)建一個(gè)Entry對(duì)象

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

2.2 泛型構(gòu)造器

接下來,第二個(gè)構(gòu)造器是泛型構(gòu)造器:

public  Entry(E element) {
this.data = element.toString();
this.rank = element.getRank();
}

雖然Entry類不是通用的,但它有一個(gè)參數(shù)為E的泛型構(gòu)造函數(shù)。

泛型類型E是受限制的,應(yīng)該實(shí)現(xiàn)Rankable和Serializable接口。

現(xiàn)在,讓我們看看Rankable接口,下面是其中一個(gè)方法:

public interface Rankable {
public int getRank();
}

假設(shè)我們有一個(gè)實(shí)現(xiàn)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;
}
@Override
public int getRank() {
return sales;
}
}

然后我們可以使用泛型構(gòu)造函數(shù)和Product創(chuàng)建Entry對(duì)象:

@Test
public 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 {
private T data;
private int rank;
}

我們將在此類中添加與上一節(jié)相同的兩種類型的構(gòu)造函數(shù)。

3.1 基礎(chǔ)構(gòu)造器

首先,讓我們?yōu)镚enericEntry類編寫一個(gè)簡(jiǎn)單的非泛型構(gòu)造函數(shù):

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

盡管GenericEntry是泛型類,但這是一個(gè)簡(jiǎn)單的,沒有任何參數(shù)的構(gòu)造函數(shù)。
現(xiàn)在,我們可以使用此構(gòu)造函數(shù)來創(chuàng)建GenericEntry:

@Test
public void givenNonGenericConstructor_whenCreateGenericEntry_thenOK() {
GenericEntry entry = new GenericEntry(1);
assertNull(entry.getData());
assertEquals(1, entry.getRank());
}

3.2 泛型構(gòu)造器

接下來,在類中添加第二個(gè)構(gòu)造函數(shù):

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

這是一個(gè)泛型構(gòu)造函數(shù),它有一個(gè)泛型類型T的數(shù)據(jù)參數(shù)。注意,我們不需要在構(gòu)造函數(shù)聲明中添加,因?yàn)樗请[含的。
現(xiàn)在,讓我們測(cè)試一下通用構(gòu)造函數(shù):

@Test
public void givenGenericConstructor_whenCreateGenericEntry_thenOK() {
GenericEntry entry = new GenericEntry("sample", 1);
assertEquals("sample", entry.getData());
assertEquals(1, entry.getRank()); 
}

4.不同類型的泛型構(gòu)造函數(shù)

在泛型類中,還有一個(gè)構(gòu)造函數(shù),其泛型類型與類的泛型類型不同:

public  GenericEntry(E element) {
this.data = (T) element;
this.rank = element.getRank();
}

GenericEntry構(gòu)造函數(shù)有類型為E的參數(shù),該參數(shù)與T類型不同。讓我們看看它的實(shí)際效果:

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

注意:在示例中,我們使用Product(E)創(chuàng)建Serializable(T)類型的GenericEntry,只有當(dāng)類型E的參數(shù)可以轉(zhuǎn)換為T時(shí),我們才能使用此構(gòu)造函數(shù)。

5.多種泛類型

接下來,我們有兩個(gè)泛型類型參數(shù)的泛型類MapEntry:

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

MapEntry有一個(gè)兩個(gè)參數(shù)的泛型構(gòu)造函數(shù),每個(gè)參數(shù)都是不同的類型。讓我們用一個(gè)簡(jiǎn)單的單元測(cè)試測(cè)試一下:

@Test
public void givenGenericConstructor_whenCreateGenericEntryWithTwoTypes_thenOK() {
MapEntry entry = new MapEntry("sample", 1);
assertEquals("sample", entry.getKey());
assertEquals(1, entry.getValue().intValue()); 
}

6.通配符

最后,我們可以在泛型構(gòu)造函數(shù)中使用通配符:

public GenericEntry(Optional optional) {
if (optional.isPresent()) {
this.data = (T) optional.get();
this.rank = optional.get().getRank();
}
}

在這兒,我們?cè)贕enericEntry構(gòu)造函數(shù)中使用通配符來綁定Optional類型:

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

請(qǐng)注意,我們應(yīng)該能夠?qū)⒖蛇x參數(shù)類型(Product示例)轉(zhuǎn)換為GenericEntry類型(Serializable示例)。

以上是“不同Java泛型構(gòu)造函數(shù)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)站題目:不同Java泛型構(gòu)造函數(shù)的示例分析
本文網(wǎng)址:http://weahome.cn/article/ipeghi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部