泛型簡介,泛型類及使用

来源:http://www.cnblogs.com/wzy330782/archive/2016/03/30/5339180.html
-Advertisement-
Play Games

如果我們需要產生多個對象,每個對象的邏輯完全一樣,只是對象內的成員變數的類型不同。那麼我們該如何去做? ① 創建多個類文件,給每個類中的成員變數設置指定的數據類型; 1 public class Demo1{ 2 public static void main(String []args){ 3 M ...


如果我們需要產生多個對象,每個對象的邏輯完全一樣,只是對象內的成員變數的類型不同。那麼我們該如何去做?

①   創建多個類文件,給每個類中的成員變數設置指定的數據類型;

 1 public class Demo1{
 2     public static void main(String []args){
 3         MyClass1 myclass1=new MyClass1("張三");
 4         System.out.println(myclass1.getData());
 5         MyClass2 myclass2=new MyClass2(10);
 6         System.out.println(myclass2.getData());
 7     }
 8 }
 9 
10 class MyClass1{
11     private String data;
12     public MyClass1(String data){
13         this.data=data;
14     }
15     
16     public void setData(String data){
17         this.data=data;
18     }
19     public String getData(){
20         return data;
21     }
22 }
23 
24 class MyClass2{
25     private int data;
26     public MyClass2(int data){
27         this.data=data;
28     }
29     
30     public void setData(int data){
31         this.data=data;
32     }
33     public int getData(){
34         return data;
35     }
36 }
View Code

缺點:這種方式會導致類的膨脹,重用性太差;

①   創建一個類文件,給這個類中的成員變數設置Object數據類型;

 1 public class Demo11{
 2     public static void main(String []args){
 3         MyClass myClass1=new MyClass("張三");
 4         System.out.println((String)myClass1.getData());
 5         MyClass myClass2=new MyClass(10);
 6         System.out.println((Integer)myClass2.getData());
 7         //以上可以執行
 8         //但int類型不能裝換為String類型
 9         System.out.println((String)myClass2.getData());
10     }
11 }
12 
13 class MyClass{
14     private Object data;
15     public MyClass(Object data){
16         this.data=data;
17     }
18     
19     public void setData(Object data){
20         this.data=data;
21     }
22     public Object getData(){
23         return data;
24     }
25 }
View Code

缺點:編譯時正常,但運行時可能會異常;

 

泛型類就能解決以上兩個問題;

泛型簡介

①   泛型是JDK4.5引入的新特性,也是最重要的一個特性;

②   泛型可以再編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的;

③   泛型的原理就是“類型的參數化”,即把類型看作參數。也就是說把所要操作的數據類型看作參數,就像方法的形式參數是運行時傳遞的值的占位符一樣;

④   簡單的說,類型變數扮演的角色就如同一個參數,它提供給編譯器用來類型檢查的信息;

⑤   泛型可以提高代碼的擴展性和重用性;

總結:所謂泛型,即通過參數化類型來實現在同一份代碼上操作多種數據類型,泛型編程是一種編程範式,它利用“參數化類型”將類型抽象化,從而實現更為靈活的復用;

泛型類示例:

 1 public class GenClass <T>{
 2     private T obj;
 3     public GenClass(T obj){
 4     this.obj=obj;
 5 }
 6 public T getObj(){
 7     return obj;
 8 }
 9 public void setObj(T obj){
10     this.obj=obj;
11 }
12 }

T代表類型,比如Integer,String

用泛型類解決以上問題

 1 public class GenericDemo1{
 2     public static void main(String []args){
 3         //創建一個泛型類對象
 4         GenClass<String> gen1=new GenClass<String>("張三");
 5         System.out.println(gen1.getData());
 6         GenClass<Integer> gen2=new GenClass<Integer>(10);
 7         System.out.println(gen2.getData());
 8         //使用了泛型之後再做強制類型轉換編譯無法通過
 9         //System.out.println((String)gen2.getData());
10     }
11 }
12 
13 //創建一個泛型類
14 class GenClass<T>{
15     private T data;
16     public GenClass(T data){
17         this.data=data;
18     }
19     
20     public void setData(T data){
21         this.data=data;
22     }
23     public T getData(){
24         return data;
25     }
26 }
View Code

泛型的用法

① 泛型的參數類型可以使泛型類;

 1 public class GenericDemo1{
 2     public static void main(String []args){
 3         //一個泛型類作為另一個泛型類的參數
 4         GenClass<GenClass<Student>> gen1=new GenClass<GenClass<Student>>();
 5         GenClass<Student> gen2=new GenClass<Student>();
 6         gen2.setData(new Student("張三"));
 7         gen1.setData(gen2);
 8         
 9         System.out.println(gen1.getData().getData());
10     }
11 }
12 
13 //創建一個泛型類
14 class GenClass<T>{
15     private T data;
16     public GenClass(){
17         
18     }
19     public GenClass(T data){
20         this.data=data;
21     }
22     
23     public void setData(T data){
24         this.data=data;
25     }
26     public T getData(){
27         return data;
28     }
29 }
30 
31 class Student{
32     private String name;
33     public Student(String name){
34         this.name=name;
35     }
36     public String toString(){
37         return "我是:"+name;
38     }
39 }
View Code

② 泛型類可以同時設置多個類型參數;

 1 public class GenericDemo1{
 2     public static void main(String []args){
 3         //帶2個參數的泛型
 4         GenClass2<String,Integer> gen1=new GenClass2<String,Integer>("張三",20);
 5         System.out.println(gen1.getData1());
 6         System.out.println(gen1.getData2());
 7     }
 8 }
 9 
10 class GenClass2<T1,T2>{
11     private T1 data1;
12     private T2 data2;
13     public GenClass2(T1 data1,T2 data2){
14         this.data1=data1;
15         this.data2=data2;
16     }
17     public T1 getData1(){
18         return data1;
19     }
20     public T2 getData2(){
21         return data2;
22     }
23 }
View Code

③ 泛型類可以繼承泛型類;

 1 public class GenericDemo2{
 2     public static void main(String []args){
 3         //一個泛型類繼承另一個泛型類
 4         SubClass<String,Integer> sub=new SubClass<String,Integer>("張三",20);
 5         System.out.println(sub.show1());
 6     }
 7 }
 8 
 9 class SuperClass<T1>{
10     private T1 var1;
11     public SuperClass(T1 var1){
12         this.var1=var1;
13     }
14     
15     public T1 show1(){
16         return var1;
17     }
18 }
19 
20 class SubClass<T1,T2> extends SuperClass<T1>{
21     private T2 var2;
22     public SubClass(T1 var1,T2 var2){
23         super(var1);
24         this.var2=var2;
25     }
26     //重寫父類的方法
27     public T1 show1(){
28         return super.show1();
29     }
30 }
View Code

④泛型類可以實現泛型介面;

 1 public class GenericDemo2{
 2     public static void main(String []args){
 3         //一個泛型類繼承另一個泛型類
 4         SubClass<String,Integer> sub=new SubClass<String,Integer>("張三",20);
 5         System.out.println(sub.show1());
 6         //實現介面的方法
 7         sub.show2(100);
 8     }
 9 }
10 
11 class SuperClass<T1>{
12     private T1 var1;
13     public SuperClass(T1 var1){
14         this.var1=var1;
15     }
16     
17     public T1 show1(){
18         return var1;
19     }
20 }
21 
22 interface IInfo<T2>{
23     public void show2(T2 var3);
24 }
25 
26 class SubClass<T1,T2> extends SuperClass<T1> implements IInfo<T2>{
27     private T2 var2;
28     public SubClass(T1 var1,T2 var2){
29         super(var1);
30         this.var2=var2;
31     }
32     //重寫父類的方法
33     public T1 show1(){
34         return super.show1();
35     }
36     //實現介面的方法
37     public void show2(T2 var3){
38         System.out.println(var3);
39         System.out.println(var2);
40         //雖然都是Integer類型,但泛型會先將其轉為Object類型,所以不能相加
41         //System.out.println(var2+var3);
42     }
43 }
View Code
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • maven出現後,很多公司會用maven來構建項目,單僅僅只是單項目單工程的 並沒有使用多工程來構建,這樣在以後,項目越來越大,業務越來越多以後,項目會難以維護,越發龐大,維護成本提高,團隊士氣也會下降 等等情況,使用maven構建多工程就是如今的趨勢 這邊演示一個maven工程相互依賴的例子,高手 ...
  • 簡介 前段時間寫的java設計模式--代理模式,最近在看Spring Aop的時候,覺得於代理模式應該有密切的聯繫,於是決定瞭解下Spring Aop的實現原理。 說起AOP就不得不說下OOP了,OOP中引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。但是,如果我們需 ...
  • 上一篇在這 C++混合編程之idlcpp教程Lua篇(3) 與前面的工程相似,工程LuaTutorial2中,同樣加入了三個文件 LuaTutorial2.cpp, Tutorial2.i, tutorial2.lua。其中LuaTutorial2.cpp的內容基本和LuaTutorial1.cpp ...
  • 在使用Elasticsearch的時候,一定會遇到這種場景——希望批量的導入數據,而不是一條一條的手動導入。那麼此時,就一定會需要bulk命令! 更多內容參考 "我整理的Elk教程" bulk批量導入 批量導入可以合併多個操作,比如index,delete,update,create等等。也可以幫助 ...
  • 本文章向大家介紹java如何實現判斷時間是否為下午或上午,感興趣的碼農可以參考一下,請看下麵代碼: 原文地址:http://www.manongjc.com/article/536.html 其他文章: d3.js畫矢量圖+可拖拽的實現思路 ZXing 二維碼解析生成工具類 java貪食蛇源代碼分享 ...
  • 本文章向碼農們介紹php 表單提交錯誤後返回數據消失問題的解決方法,感興趣的碼農可以參考一下。 表單提交錯誤後返回數據消失怎麼辦吶,今天就來分析解決一下這個問題。 狀況概述: 做填寫表單信息提交的時候會碰到一個問題就是當用戶填寫並提交表單後,程式判斷不符合要求並返回,返回之後之前填寫的表單信息會被清 ...
  • opencv3.1 +windows10+ vs2015配置見文章 win10下vs2015配置Opencv3.1.0過程詳解(轉) 代碼經過測試,識別度極高,測試圖片50w張,識別率90%以上 如果可以結合微軟牛津計劃的api可以識別圖片物品 https://www.azure.cn/projec ...
  • 下載安裝Opencv3.1.0 下載Opencv3.1.0,進入官網,點擊opencv for windows即可下載。 點擊運行下載好的文件。實際上,opencv的安裝程式就是解壓縮文件,個人因為只有C盤,所以就直接在C盤建了一個文件夾Opencv3.1.0。 選好路徑之後點擊Extract即可。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...