JAVA----泛型

泛型

認識泛型

定義類、接口、方法時,同時聲明了一個或者多個類型變量(如:) ,稱為泛型類、泛型接口,泛型方法、它們統稱為泛型。
作用:利用泛型,可以限制集合存儲數據的類型.
泛型的本質:把具體的數據類型作為參數傳給類型變量。

泛型類

類型變量建議用大寫的英文字母,常用的有:E、T、K、V 等

public class ArrayList<E>{. . .
}修飾符 class 類名<類型變量,類型變量,…> { }
  1. 目標:了解泛型類的定義方式

需求:定義一個MyGenericCls類,要求該類有一個屬性,屬性的類型可以在創建對象時指定

public class MyGenericCls<E>{E name;public void setName(E name) {this.name = name;}public E getName() {return name;}
}
  //1.創建對象,將name的類型指定為StringMyGenericCls<String> cls1 = new MyGenericCls<>();cls1.setName("張三");String name1 = cls1.getName();System.out.println(name1);//2.創建對象,將name的類型指定為IntegerMyGenericCls<Integer> cls2 = new MyGenericCls<>();cls2.setName(666);Integer name2 = cls2.getName();System.out.println(name2);//3.泛型類的作用:可以提高一個類中數據類型的靈活性

泛型接口

  1. 目標:了解泛型接口的定義方式
public interface A<E>{. . .
}
修飾符 interface 接口名<類型變量,類型變量,…> { }

需求:定義一個泛型接口MyGenericInter,并定義實現類實現該接口

public interface MyGenericInter<E> {//接口名后面定義的泛型(類型變量),在整個接口中要使用數據類型的地方都可以用,可以提高一個接口中類型的靈活性void method1(E e);E method2();
}
public class InterImpl1 implements MyGenericInter<String>{@Overridepublic void method1(String s) {}@Overridepublic String method2() {return null;}
}
public class InterImpl2 implements MyGenericInter<Integer>{@Overridepublic void method1(Integer integer) {}@Overridepublic Integer method2() {return null;}
}

泛型方法

  1. 目標:了解泛型方法的定義方式
public static <T> void test(T t){   
}修飾符 <類型變量,類型變量,…>  返回值類型 方法名(形參列表) { }

需求:定義一個泛型方法,可以接收任意類型的引用數據類型數組,將其變成ArrayList集合返回

/*定義方法:數組的類型不確定!需要提高類型的靈活性* 明確參數:數組類型,數組的元素使用泛型變量* 明確返回值:ArrayList集合,集合中存儲的元素和數組元素類型保持一致*/public static <T> ArrayList<T> arrToList(T[] arr) {//2.創建ArrayList集合對象ArrayList<T> list = new ArrayList<T>();//3.遍歷數組for (int i = 0; i < arr.length; i++) {T data = arr[i];list.add(data);}return list;}
Integer[] arr1 = {11,22,33,44,55};
ArrayList<Integer> list1 = arrTolist(arr1);
System.out.println(list1);String[] arr2 = {"物", "羅"};
ArrayList<Integer> list2 = arrTolist(arr2);
System.out.println(list2);//[11, 22, 33, 44, 55]
//[物, 羅]

泛型通配符

通配符:?
可以在“使用泛型”的時候代表不確定的類型
泛型的上下限:
泛型上限: ? extends Car: ? 能接收的必須是Car或者其子類 。
泛型下限: ? super Car : ? 能接收的必須是Car或者其父類。
4. 目標:了解泛型通配符的使用方式
需求:優化sellApple和sellBanana兩個方法,變成一個批量銷售所有水果的方法

/*** 水果類*/
public class Fruit {
}//蘋果類
public class Apple extends Fruit{
}//香蕉類
public class Banana extends Fruit{
}
//創建蘋果集合
ArrayList<Apple> apples = new ArrayList<>();
//創建香蕉集合
ArrayList<Banana> bananas = new ArrayList<>();
    //public static void sellFruit(ArrayList<?> fruits){//場景:放入集合時,集合中的數據類型不確定,此時使用泛型通配符?,此時?代表一切類型//public static void sellFruit(ArrayList<?> fruits) {//場景:此時還是不確定給泛型變量賦什么類型,依然使用通配符?,不過要限制它的范圍,使用通配符的上限//要求:?要么是水果類型,要么是水果的子類類型public static void sellFruit(ArrayList<? extends Fruit> fruits){System.out.println("銷售水果");}//批量銷售蘋果public static void sellApple(ArrayList<Apple> apples) {System.out.println("銷售蘋果");}//批量銷售香蕉public static void sellBanana(ArrayList<Banana> bananas) {System.out.println("銷售香蕉");}
}
public static void main(String[] args) {//需求:優化sellApple和sellBanana兩個方法,變成一個批量銷售所有水果的方法//創建蘋果集合ArrayList<Apple> apples = new ArrayList<>();//創建香蕉集合ArrayList<Banana> bananas = new ArrayList<>();//銷售蘋果和香蕉//sellApple(apples);//sellBanana(bananas);//sellBanana(apples);//sellApple(bananas);//此時方法的形參類型是ArrayList,所以sellFruit、sellApple、sellBanana三個方法的類型是一樣的!sellFruit(apples);sellFruit(bananas);//創建狗集合,并銷售ArrayList<Dog> dogs = new ArrayList<>();//有些時候,雖然不確定具體是什么類型,但是還是要限制一下類型的范圍,此時需要限制類型是水果!//sellFruit(dogs);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45395.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45395.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Gitee簡易使用流程(后期優化)

目錄 1.修改用戶名 2.文件管理 新建文件/文件夾流程如下&#xff1a; 上傳文件流程如下&#xff1a; 以主頁界面為起點 1.修改用戶名 點解右上角的頭像--> 點擊“賬號設置” 點擊左邊欄里的“個人資料“ 直接修改用戶名即可 2.文件管理 選擇一個有修改權限倉庫&#…

【從0到1進階Redis】主從復制

筆記內容來自B站博主《遇見狂神說》&#xff1a;Redis視頻鏈接 1、概念 主從復制&#xff0c;是指將一個臺 Redis 服務器的數據&#xff0c;復制到其他的 Redis 服務器。前者稱為主節點&#xff08;master/leader&#xff09;&#xff0c;后者稱為從節點&#xff08;slave/foll…

this指向解析

先看題目&#xff1a; 第一題&#xff1a; var name window var person1 { name: person1, show1: function () { console.log(this.name) }, show2: () > console.log(th show3: function () { return function () { …

MFC之對話框--重繪元文件

文章目錄 實現示例展示需要繪制的窗口/位置控件位置更新下一次示例粗細滑動部分更新 重繪元文件&#xff08;窗口變化內容消失&#xff09;方法一&#xff1a;使用元文件方法二&#xff1a;兼容設備方法三&#xff1a;使用自定義類存儲繪圖數據除畫筆外功能處理畫筆功能處理 保…

springmvc1

以前的servlet程序&#xff1a; springmvc 不同的處理器&#xff1a;不同的方法或者處理類 所有的請求都會經過dispathcherservlet的doservice方法&#xff1a; mvc原理&#xff1a; 前端控制器&#xff1a;jsp或者什么東西

Python字符串基礎與高級操作

在Python中&#xff0c;字符串是不可變的數據類型&#xff0c;用于存儲一系列的字符。它們可以被創建、訪問、操作和格式化&#xff0c;但一旦創建&#xff0c;其內容就不能改變。下面是一篇關于Python字符串技術的詳細講解&#xff0c;包括創建、訪問、更新、轉義、運算符、格…

Phpstudy 2018 之xhcms搭建

1、由于直接訪問根目錄無法進入網站 2、所以采用搭建網站&#xff0c;第一使用系統服務模式、選擇php-5.4.45Apache模式 3、網站域名為本地ip地址或者127.0.0.1、端口8085 4、在navicat創建名字為xjcms的數據庫&#xff0c;并導入sql數據庫文件 5、瀏覽器輸入127.0.0.1:8085直接…

中風傷寒、感冒、六經辨證筆記

目錄 基礎傳經的原因傳經的過程及速度傳經的危害感冒時體痛頭痛的原因根據頭痛的位置辨經 太陽病太陽中風外風內熱 表虛感冒顆粒&#xff08;桂枝葛根湯&#xff09; 少陽病辨病總結傷寒論原文半表半里太陽為開&#xff0c;陽明為闔&#xff0c;少陽為樞膽的作用幫助腸胃消化、…

deepstream讀取mp4文件及不同類型視頻輸入bug解決

在deepstream中使用mp4文件&#xff0c;與rtsp類似&#xff0c;使用uridecodebin即可&#xff0c;&#xff08;可見官方test.py文件&#xff09; def create_source_bin(index, uri):print("Creating source bin")# Create a source GstBin to abstract this bins c…

定投投什么?

定投可以選擇的品種有銀行理財和基金 銀行理財目前有的品種有期限限制&#xff0c;不是那么公開的特點。如果說你想通過定投積累一筆低風險的&#xff0c;用于應急或者短期內要用的錢&#xff0c;可以選擇定投現金類銀行理財。 基金是最適合定投的產品&#xff0c; 基金分為…

【自然語言處理】面向新冠肺炎的社會計算應用

面向新冠肺炎的社會計算應用 1 任務目標 1.1 案例簡介 新冠肺炎疫情牽動著我們每一個人的心&#xff0c;在這個案例中&#xff0c;我們將嘗試用社會計算的方法對疫情相關的新聞和謠言進行分析&#xff0c;助力疫情信息研究。本次作業為開放性作業&#xff0c;我們提供了疫情…

C++ STL stable_sort用法

一&#xff1a;功能 對區間內元素進行排序&#xff0c;保證相等元素的順序&#xff08;穩定排序&#xff09; 二&#xff1a;用法 #include <iostream>struct Record {std::string label;int rank; };int main() {std::vector<Record> data {{"q", 1},…

代碼隨想錄第五十一天 | 300.最長遞增子序列 , 674. 最長連續遞增序列 , 718. 最長重復子數組

300.最長遞增子序列 看完想法&#xff1a;在dp遞推公式那里沒有太看得懂。首先dp【i】的狀態肯定是由前面的dp【0】到dp【i-1】推出的&#xff0c;但是dp【0】到dp【i-1】可以推出dp【i】有個前提就是(nums【i】 > nums【0到i-1任意一個】),例如nums【1】 2, nums【3】 5…

Tomcat下載安裝配置教程(零基礎超詳細)

「作者簡介」&#xff1a;冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎著作 《網絡安全自學教程》&#xff0c;適合基礎薄弱的同學系統化的學習網絡安全&#xff0c;用最短的時間掌握最核心的技術。 Tomcat 1、下載…

外包干了1個月,技術明顯退步。。。

有一種打工人的羨慕&#xff0c;叫做“大廠”。 真是年少不知大廠香&#xff0c;錯把青春插稻秧。 但是&#xff0c;在深圳有一群比大廠員工更龐大的群體&#xff0c;他們頂著大廠的“名”&#xff0c;做著大廠的工作&#xff0c;還可以享受大廠的伙食&#xff0c;卻沒有大廠…

【輕松拿捏 】Java-static關鍵字(面試)

Java-static關鍵字 1. 定義和基本概念 回答要點&#xff1a; 示例回答&#xff1a; 2. static 變量 回答要點&#xff1a; 示例回答&#xff1a; 代碼示例&#xff1a; 3. static方法 回答要點&#xff1a; 示例回答&#xff1a; 代碼示例&#xff1a; 4. static 代…

Modbus協議簡介與Python實現

Modbus協議是工業自動化和控制系統中廣泛使用的通信協議。自1979年由Modicon(現為施耐德電氣的一部分)引入以來,它已經成為一種標準的通信協議,用于連接電子設備和傳感器。Modbus協議基于主從架構,支持多種物理層和傳輸模式,如串行通信(RS-232/RS-485)和以太網。 1. Mo…

10個使用Numba CUDA進行編程的例子

以下是10個使用Numba CUDA進行編程的例子&#xff0c;這些例子涵蓋了基本的向量加法、矩陣乘法以及其他一些常見操作&#xff1a; 向量加法 from numba import cuda import numpy as np cuda.jit def vector_add(a, b, c):i cuda.grid(1)if i < len(a):c[i] a[i] b[i] …

STM32智能交通監測系統教程

目錄 引言環境準備智能交通監測系統基礎代碼實現&#xff1a;實現智能交通監測系統 4.1 數據采集模塊 4.2 數據處理與控制模塊 4.3 通信與網絡系統實現 4.4 用戶界面與數據可視化應用場景&#xff1a;交通監測與管理問題解決方案與優化收尾與總結 1. 引言 智能交通監測系統通…

Linux--線程池(包含日志的解釋)

線程系列&#xff1a; Linux–線程的認識(一) Linux–線程的分離、線程庫的地址關系的理解、線程的簡單封裝&#xff08;二&#xff09; 線程的互斥&#xff1a;臨界資源只能在同一時間被一個線程使用 生產消費模型 信號量 線程池 線程池&#xff08;Thread Pool&#xff09;是…