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

溫馨提示×

溫馨提示×

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

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

Spring Boot實現STOMP協議的WebSocket的方法步驟

發布時間:2020-09-28 16:54:43 來源:腳本之家 閱讀:117 作者:liululee 欄目:編程語言

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

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

  @Override
  public int getRank() {
    return sales;
  }
}

然后我們可以使用泛型構造函數和Product創建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<T> {
  private T data;
  private int rank;
}

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

3.1 基礎構造器

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

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

盡管GenericEntry是泛型類,但這是一個簡單的,沒有任何參數的構造函數。

現在,我們可以使用此構造函數來創建GenericEntry:

@Test
public 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的數據參數。注意,我們不需要在構造函數聲明中添加,因為它是隱含的。

現在,讓我們測試一下通用構造函數:

@Test
public 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類型不同。讓我們看看它的實際效果:

@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)創建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有一個兩個參數的泛型構造函數,每個參數都是不同的類型。讓我們用一個簡單的單元測試測試一下:

@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.通配符

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

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

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

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

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

7.結束語

在本文中,我們學習了如何在泛型和非泛型類中定義和使用泛型構造函數。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

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

AI

南岸区| 息烽县| 长顺县| 雅安市| 宜丰县| 昭通市| 大同县| 鄂伦春自治旗| 冷水江市| 正镶白旗| 安顺市| 行唐县| 深州市| 南宁市| 河北省| 康定县| 敦煌市| 新河县| 庐江县| 新野县| 疏附县| 同德县| 蓬溪县| 高要市| 河池市| 宾阳县| 田阳县| 绥滨县| 洛南县| 涡阳县| 房山区| 屏东县| 临湘市| 河东区| 旬邑县| 广饶县| 阿拉善左旗| 关岭| 郧西县| 巴马| 鄂伦春自治旗|