泛型類的概述和使用--泛型方法的概述和使用---泛型介面的概述和使用---泛型高級(通配符)

来源:https://www.cnblogs.com/ztg-java-xuexi/archive/2022/03/23/16047167.html
-Advertisement-
Play Games

泛型類:把泛型定義在類上 package Day16; //泛型類:把泛型定義在類上 public class ObjectDemo<T> { //把泛型定義在類上 調用時只能調用和添加本類型的數據 private T obj; public void setObj(T obj) { this.ob ...


泛型类:把泛型定义在类上

package Day16;
//泛型类:把泛型定义在类上
public class ObjectDemo<T> {
    //把泛型定义在类上---调用时只能调用和添加本类型的数据
    private  T obj;

    public void setObj(T obj) {
        this.obj = obj;
    }

    public T getObj() {
        return obj;
    }
}
package cn.itcast_04;

/*
 * 泛型类的测试
 */
public class ObjectToolDemo {
    public static void main(String[] args) {
        // ObjectTool ot = new ObjectTool();
        //
        // ot.setObj(new String("风清扬"));
        // String s = (String) ot.getObj();
        // System.out.println("姓名是:" + s);
        //
        // ot.setObj(new Integer(30));
        // Integer i = (Integer) ot.getObj();
        // System.out.println("年龄是:" + i);

        // ot.setObj(new String("林青霞"));
        // // ClassCastException
        // Integer ii = (Integer) ot.getObj();
        // System.out.println("姓名是:" + ii);

        System.out.println("-------------");

        ObjectTool<String> ot = new ObjectTool<String>();
        // ot.setObj(new Integer(27)); //这个时候编译期间就过不去
        ot.setObj(new String("林青霞"));
        String s = ot.getObj();
        System.out.println("姓名是:" + s);

        ObjectTool<Integer> ot2 = new ObjectTool<Integer>();
        // ot2.setObj(new String("风清扬"));//这个时候编译期间就过不去
        ot2.setObj(new Integer(27));
        Integer i = ot2.getObj();
        System.out.println("年龄是:" + i);
    }
}

 泛型类:泛型定义在方法上

格式:public <泛型类>  返回值类型 方法名(泛型类 变量名)

 

package Day16;
//泛型类:把泛型定义在类上
//public class ObjectDemo<T> {
//    //把泛型定义在类上---调用时只能调用和添加本类型的数据
//    private  T obj;
//
//    public void setObj(T obj) {
//        this.obj = obj;
//    }
//
//    public T getObj() {
//        return obj;
//    }
//}
//泛型定义在方法上
public class ObjectDemo{
    //定义方法
    public<T> void show(T s){
        System.out.println(s);
    }


}
package Day16;

public class Lx8 {
    public static void main(String[] args) {
        //对ObjectDemo类创建
        ObjectDemo A = new ObjectDemo();

      //调用方法
        A.show("赵同刚");
        A.show(25);
        A.show("有钱");
        A.show(true);

    }
}

 泛型接口的概述和使用

一:定义泛型接口

package Day16;
//接口的定义格式:[修饰符] interface 接口名 [extends 父接口名列表]
//泛型接口--把泛型定义在接口上
public interface JK<T> {
    //定义一个抽象方法
    //实现类必须重写此方法
    public abstract void show(T f);
}

 

 二:实现类实现接口(分两种情况)

package Day16;
//接口的实现类
//实现类在实现接口的时候
////第一种情况:已经知道该是什么类型的了
//实现类的书写格式  [修饰符] class <类名> [extends 父类名] [implements 接口列表]
//public class SX implements JK<String> {
//    //在实现类中重写接口中的抽象方法
//    public void  show(String B){
//        System.out.println(B);
//    }
//}
//第二种情况:实现类在实现接口的时候还不知道是什么类型
public class SX<T> implements JK<T>{
    //实现类必须重写接口中的抽象方法
    public void  show(T e){
        System.out.println(e);
    }
}

 

 三:测试类

package Day16;

public class Lx9 {
    public static void main(String[] args) {
        //对接口实现类创建对象
        SX AA = new SX();
        //调用接口实现类当中的方法
        AA.show(true);
    }
}

 泛型高级(通配符)

* 泛型高级(通配符)
     * ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
     * ? extends E:向下限定,E及其子类
     * ? super E:向上限定,E极其父类
package cn.itcast_07;

import java.util.ArrayList;
import java.util.Collection;

/*
     * 泛型高级(通配符)
     * ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
     * ? extends E:向下限定,E及其子类
     * ? super E:向上限定,E极其父类
 */
public class GenericDemo {
    public static void main(String[] args) {
        // 泛型如果明确的写的时候,前后必须一致
        Collection<Object> c1 = new ArrayList<Object>();
        // Collection<Object> c2 = new ArrayList<Animal>();
        // Collection<Object> c3 = new ArrayList<Dog>();
        // Collection<Object> c4 = new ArrayList<Cat>();

        // ?表示任意的类型都是可以的
        Collection<?> c5 = new ArrayList<Object>();
        Collection<?> c6 = new ArrayList<Animal>();
        Collection<?> c7 = new ArrayList<Dog>();
        Collection<?> c8 = new ArrayList<Cat>();

        // ? extends E:向下限定,E及其子类
        // Collection<? extends Animal> c9 = new ArrayList<Object>();
        Collection<? extends Animal> c10 = new ArrayList<Animal>();
        Collection<? extends Animal> c11 = new ArrayList<Dog>();
        Collection<? extends Animal> c12 = new ArrayList<Cat>();

        // ? super E:向上限定,E极其父类
        Collection<? super Animal> c13 = new ArrayList<Object>();
        Collection<? super Animal> c14 = new ArrayList<Animal>();
        // Collection<? super Animal> c15 = new ArrayList<Dog>();
        // Collection<? super Animal> c16 = new ArrayList<Cat>();
    }
}

class Animal {
}

class Dog extends Animal {
}

class Cat extends Animal {
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於HarmonyOS 自定義View我們可以學習HarmonyOS自定義組件 這篇文檔,今天描述自定義折線圖的功能,我們從“準備工作”、“初始化畫筆”、“繪畫折線圖”、“運行效果圖”,這四個方面進行描述 1. 準備工作 想要實現折線圖我們瞭解Paint,獲取屏幕的寬高,這幾個功能的實現 獲取屏幕的 ...
  • 一、新增的語義化佈局標簽: 1. header和footer標簽 頁面中一個內容區塊的頭部和尾部佈局 2. nav 導航區域 3. article標簽 頁面中獨立的內容部分佈局 4. aside標簽 在獨立內容之外,但是又與article有關聯的部分佈局 二、新增媒體標簽 1. audio(音頻) ...
  • 前言 在 《一篇帶你用 VuePress + Github Pages 搭建博客》中,我們使用 VuePress 搭建了一個博客,最終的效果查看:TypeScript 中文文檔。 在搭建這樣一個博客後,其實還有很多的優化工作需要做,本篇我們來盤點一下那些完成基礎搭建後必做的 10 個優化。 1. 開 ...
  • 前言 大部分的面試者在IT行業面試中,提及設計模式,可以列舉一大堆,但是面試官要求細說的時候,往往部分基礎不夠牢固的同學只能提及簡單工廠。今天我們來對面試過程中最常見的簡單工廠、工廠方法和抽象工廠進行一個剖析,喜歡的朋友可以點個關註哦。 正文 在面向對象的編程中,一般通過繼承和虛函數來提供抽象能力, ...
  • 外觀模式又叫門面模式,屬於結構型模式;是一種通過為多個複雜的子系統提供一個一致的介面,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一介面,外部應用程式不用關心內部子系統的具體細節,這樣會大大降低應用程式的複雜度,提高了程式的可維護性。 現在微服務和模塊化越來越流行,我們都會把一個複雜的系統 ...
  • 《零基礎學Java》 標簽組件與圖標 在Swing中顯示文本或提示信息可以使用標簽(JLabel),它可以顯示文字和圖標。 JLabel 標簽組件 標簽由 JLabel類 定義,它的父類為 JComponent類。標簽可以顯示一行只讀文本,一個圖像(它不能產生任何事件)。 JLabel類常用的構造方 ...
  • 1 項目介紹 最開始是一個單體應用,所有功能模塊都寫在一個項目里,後來覺得項目越來越大,於是決定把一些功能拆分出去,形成一個一個獨立的微服務,於是就有個問題了,登錄、退出、許可權控制這些東西怎麼辦呢?總不能每個服務都複製一套吧,最好的方式是將認證與鑒權也單獨抽離出來作為公共的服務,業務系統只專心做業務 ...
  • 非同步請求特點:某一個時刻,瀏覽器可以委托多個非同步請求對象發送請求,無需等待請求處理完成 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...