日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java泛型类的构造函数_Java泛型构造函数

發(fā)布時(shí)間:2024/3/24 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java泛型类的构造函数_Java泛型构造函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

推薦關(guān)注公眾號(hào):鍋外的大佬

每日推送國外優(yōu)秀的技術(shù)翻譯文章,勵(lì)志幫助國內(nèi)的開發(fā)者更好地成長!

1.概述

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

2.非泛型類

首先,先寫一個(gè)簡單的類: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ù)的簡單構(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對象

@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對象:

@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è)簡單的非泛型構(gòu)造函數(shù):

public GenericEntry(int rank) {

this.rank = rank;

}

盡管GenericEntry是泛型類,但這是一個(gè)簡單的,沒有任何參數(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)在,讓我們測試一下通用構(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è)簡單的單元測試測試一下:

@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 extends Rankable> optional) {

if (optional.isPresent()) {

this.data = (T) optional.get();

this.rank = optional.get().getRank();

}

}

在這兒,我們在GenericEntry構(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());

}

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

7.結(jié)束語

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

完整的源代碼可以在GitHub獲取(點(diǎn)擊查看原文)。

原文鏈接:https://www.baeldung.com/java-generic-constructors

作者:baeldung

譯者:Emma

總結(jié)

以上是生活随笔為你收集整理的java泛型类的构造函数_Java泛型构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。