最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

不同Java泛型構(gòu)造函數(shù)的詳解

 更新時(shí)間:2019年06月10日 10:55:18   作者:鍋外的大佬  
這篇文章主要介紹了不同Java泛型構(gòu)造函數(shù)的詳解,因?yàn)閷?duì)象是應(yīng)用類(lèi)型,對(duì)象賦值是指向同一個(gè)對(duì)象,所以如果需要保存對(duì)象某個(gè)時(shí)刻的狀態(tài),就需要構(gòu)造函數(shù)來(lái)new一個(gè)新的對(duì)象。下面我們來(lái)詳細(xì)了解一下吧

1.概述

我們之前討論過(guò)Java Generics的基礎(chǔ)知識(shí)。在本文中,我們將了解Java中的通用構(gòu)造函數(shù)。
泛型構(gòu)造函數(shù)是至少需要有一個(gè)泛型類(lèi)型參數(shù)的構(gòu)造函數(shù)。我們將看到泛型構(gòu)造函數(shù)并不都是在泛型類(lèi)中出現(xiàn)的,而且并非所有泛型類(lèi)中的構(gòu)造函數(shù)都必須是泛型。

2.非泛型類(lèi)

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

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

在這個(gè)類(lèi)中,我們將添加兩個(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ù)來(lái)創(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)造器

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

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

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

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

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

public interface Rankable {
public int getRank();
}

假設(shè)我們有一個(gè)實(shí)現(xiàn)Rankable接口的類(lèi)——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.泛型類(lèi)

接下來(lái),我們看一下泛型類(lèi):GenericEntry

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

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

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

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

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

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

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

3.2 泛型構(gòu)造器

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

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

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

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

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

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

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

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

@Test
public 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)創(chuàng)建Serializable(T)類(lèi)型的GenericEntry,只有當(dāng)類(lèi)型E的參數(shù)可以轉(zhuǎn)換為T(mén)時(shí),我們才能使用此構(gòu)造函數(shù)。

5.多種泛類(lèi)型

接下來(lái),我們有兩個(gè)泛型類(lèi)型參數(shù)的泛型類(lèi)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有一個(gè)兩個(gè)參數(shù)的泛型構(gòu)造函數(shù),每個(gè)參數(shù)都是不同的類(lèi)型。讓我們用一個(gè)簡(jiǎn)單的單元測(cè)試測(cè)試一下:

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

6.通配符

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

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

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

@Test
public 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());
}

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

7.結(jié)束語(yǔ)

在本文中,我們學(xué)習(xí)了如何在泛型和非泛型類(lèi)中定義和使用泛型構(gòu)造函數(shù)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springcloud之FeignClient使用詳解

    springcloud之FeignClient使用詳解

    Feign是一種聲明式、模板化的HTTP客戶(hù)端,可以簡(jiǎn)化微服務(wù)之間的遠(yuǎn)程過(guò)程調(diào)用,通過(guò)Feign,開(kāi)發(fā)者可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù),而無(wú)需感知這是一個(gè)HTTP請(qǐng)求,引入Feign后,微服務(wù)之間的調(diào)用流程更加簡(jiǎn)化,結(jié)合Ribbon實(shí)現(xiàn)了路由負(fù)載、超時(shí)熔斷等功能
    2024-12-12
  • java 如何判斷是否可以ping通某個(gè)地址

    java 如何判斷是否可以ping通某個(gè)地址

    這篇文章主要介紹了java 如何判斷是否可以ping通某個(gè)地址,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java基于redis和mysql實(shí)現(xiàn)簡(jiǎn)單的秒殺(附demo)

    Java基于redis和mysql實(shí)現(xiàn)簡(jiǎn)單的秒殺(附demo)

    這篇文章主要介紹了Java基于redis和mysql實(shí)現(xiàn)簡(jiǎn)單的秒殺(附demo),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • JAVA代碼開(kāi)發(fā)規(guī)范

    JAVA代碼開(kāi)發(fā)規(guī)范

    本文主要對(duì)JAVA代碼開(kāi)發(fā)規(guī)范進(jìn)行詳細(xì)介紹,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Java定時(shí)器Timer簡(jiǎn)述

    Java定時(shí)器Timer簡(jiǎn)述

    本文主要介紹了Java定時(shí)器Timer的相關(guān)知識(shí),具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 聊聊Java 成員變量賦值和構(gòu)造方法誰(shuí)先執(zhí)行的問(wèn)題

    聊聊Java 成員變量賦值和構(gòu)造方法誰(shuí)先執(zhí)行的問(wèn)題

    這篇文章主要介紹了聊聊Java 成員變量賦值和構(gòu)造方法誰(shuí)先執(zhí)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Java中的CountDownLatch、CyclicBarrier和semaphore實(shí)現(xiàn)原理解讀

    Java中的CountDownLatch、CyclicBarrier和semaphore實(shí)現(xiàn)原理解讀

    這篇文章主要介紹了Java中的CountDownLatch、CyclicBarrier和semaphore實(shí)現(xiàn)原理詳解,CountDownLatch中調(diào)用await方法線程需要等待所有調(diào)用countDown方法的線程執(zhí)行,這就很適合一個(gè)業(yè)務(wù)需要一些準(zhǔn)備條件,等準(zhǔn)備條件準(zhǔn)備好之后再繼續(xù)執(zhí)行,需要的朋友可以參考下
    2023-12-12
  • Mybatis代碼生成器Mybatis Generator(MBG)實(shí)戰(zhàn)詳解

    Mybatis代碼生成器Mybatis Generator(MBG)實(shí)戰(zhàn)詳解

    本文我們主要實(shí)戰(zhàn)Mybatis官方的代碼生成器:Mybatis Generator(MBG),掌握它以后,可以簡(jiǎn)化大部分手寫(xiě)代碼,我們只需要寫(xiě)復(fù)雜邏輯代碼,需要的朋友可以參考下
    2023-05-05
  • 在IDEA使用中directory和package的操作

    在IDEA使用中directory和package的操作

    這篇文章主要介紹了在IDEA使用中directory和package的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java使用httpclient模擬post請(qǐng)求和get請(qǐng)求示例

    java使用httpclient模擬post請(qǐng)求和get請(qǐng)求示例

    這篇文章主要介紹了java使用httpclient模擬post請(qǐng)求和get請(qǐng)求示例,需要的朋友可以參考下
    2014-02-02

最新評(píng)論

武胜县| 普兰县| 西宁市| 略阳县| 甘德县| 疏勒县| 栾川县| 洪雅县| 水富县| 吕梁市| 新晃| 华阴市| 木里| 广灵县| 金沙县| 莒南县| 梅河口市| 酒泉市| 浦北县| 黄浦区| 应用必备| 平度市| 华池县| 白城市| 广汉市| 泰安市| 都匀市| 青海省| 无棣县| 恭城| 冕宁县| 五峰| 瑞金市| 三门峡市| 马边| 运城市| 论坛| 天台县| 新乡县| 万源市| 长葛市|