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

Spring Boot實(shí)現(xiàn)STOMP協(xié)議的WebSocket的方法步驟

 更新時(shí)間:2019年05月30日 15:22:27   作者:liululee  
這篇文章主要介紹了Spring Boot實(shí)現(xiàn)STOMP協(xié)議的WebSocket的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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 <E extends Rankable & Serializable> 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<T> {
  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<String> entry = new GenericEntry<String>(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<String> entry = new GenericEntry<String>("sample", 1);

  assertEquals("sample", entry.getData());
  assertEquals(1, entry.getRank());    
}

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

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

public <E extends Rankable & Serializable> 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<Serializable> entry = new GenericEntry<Serializable>(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<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ù)都是不同的類型。讓我們用一個(gè)簡單的單元測試測試一下:

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

在這兒,我們在GenericEntry構(gòu)造函數(shù)中使用通配符來綁定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());
}

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

7.結(jié)束語

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

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

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

相關(guān)文章

  • 通過Spring Boot配置動(dòng)態(tài)數(shù)據(jù)源訪問多個(gè)數(shù)據(jù)庫的實(shí)現(xiàn)代碼

    通過Spring Boot配置動(dòng)態(tài)數(shù)據(jù)源訪問多個(gè)數(shù)據(jù)庫的實(shí)現(xiàn)代碼

    這篇文章主要介紹了通過Spring Boot配置動(dòng)態(tài)數(shù)據(jù)源訪問多個(gè)數(shù)據(jù)庫的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2018-03-03
  • Java中的Semaphore信號(hào)量使用方法代碼實(shí)例

    Java中的Semaphore信號(hào)量使用方法代碼實(shí)例

    這篇文章主要介紹了Java中的Semaphore信號(hào)量使用方法代碼實(shí)例,Semaphore是一種基于計(jì)數(shù)的信號(hào)量,它可以設(shè)定一個(gè)閾值,基于此,多個(gè)線程競爭獲取許可信號(hào),做自己的申請后歸還,超過閾值后,線程申請?jiān)S可信號(hào)將會(huì)被阻塞,需要的朋友可以參考下
    2023-11-11
  • Intellij無法創(chuàng)建java文件解決方案

    Intellij無法創(chuàng)建java文件解決方案

    這篇文章主要介紹了Intellij無法創(chuàng)建java文件解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Spring核心容器IOC原理實(shí)例解析

    Spring核心容器IOC原理實(shí)例解析

    這篇文章主要介紹了Spring核心容器IOC原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 一文詳解Java如何系統(tǒng)地避免空指針問題

    一文詳解Java如何系統(tǒng)地避免空指針問題

    新手Java開發(fā)總是經(jīng)??罩羔槞z查,甚至某些老手也會(huì)犯這樣的問題,所以這篇文章小編就帶大家一起來看看如何系統(tǒng)地避免空指針問題,希望對大家有所幫助
    2024-01-01
  • 詳解Java實(shí)現(xiàn)的k-means聚類算法

    詳解Java實(shí)現(xiàn)的k-means聚類算法

    這篇文章主要介紹了詳解Java實(shí)現(xiàn)的k-means聚類算法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Spring Boot使用yml格式進(jìn)行配置的方法

    Spring Boot使用yml格式進(jìn)行配置的方法

    很多springboot項(xiàng)目使用的是yml格式,主要目的是方便對讀懂其他人的項(xiàng)目,下面小編通過本文給大家分享Spring Boot使用yml格式進(jìn)行配置的方法,需要的朋友參考下吧
    2018-04-04
  • SpringBoot中HTTP請求不通的原因級(jí)解決方法

    SpringBoot中HTTP請求不通的原因級(jí)解決方法

    HTTP 請求是指從客戶端到服務(wù)器的請求消息,對于一個(gè) Spring Boot 項(xiàng)目而言,服務(wù)器就是 Spring Boot,客戶端就是用戶本地的瀏覽器,但是會(huì)遇到SpringBoot HTTP請求不通的問題,本文介紹了一些常見問題及解決方法,需要的朋友可以參考下
    2025-02-02
  • Maven的使用之繼承與聚合

    Maven的使用之繼承與聚合

    這篇文章主要為大家詳細(xì)介紹了Maven的繼承和聚合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2023-04-04
  • spring4新特性之web開發(fā)增強(qiáng)

    spring4新特性之web開發(fā)增強(qiáng)

    這篇文章主要介紹了spring4新特性之web開發(fā)增強(qiáng)的相關(guān)資料,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

蓬莱市| 赣榆县| 白沙| 聂拉木县| 安康市| 承德县| 灵武市| 大余县| 大宁县| 南汇区| 井研县| 米泉市| 定结县| 图片| 大英县| 丰原市| 宝鸡市| 湾仔区| 玉林市| 镇巴县| 昌邑市| 山西省| 阳高县| 永川市| 义马市| 正定县| 阿克陶县| 宁强县| 会昌县| 修文县| 边坝县| 卓资县| 吐鲁番市| 吴江市| 山阴县| 博爱县| 溧阳市| 柘城县| 绥滨县| 伊吾县| 平顶山市|