首页 > 其他分享 >3.泛型

3.泛型

时间:2023-09-24 15:55:05浏览次数:18  
标签:ArrayList list public 类型 泛型 void

泛型

泛型的好处:

统一数据类型;
把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来;

泛型的细节:

java中的泛型是伪泛型,添加后,其内部依旧是按Object类型进行处理的;
泛型中不能写基本数据类型;
指定泛型的具体数据类型后,传递数据时,可以传入该类类型或者其子类类型;
如果不写泛型,类型默认是Object;

泛型的定义:

分类:
  • 泛型类:

    • 概念:定义在类后面的泛型称为泛型类;

    • 使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类;

    • 格式:此处E可以理解为变量,是用来记录数据的类型的,可以写成其他英文字符(最常见为:T、E、K、V);

      修饰符 class 类名<类型>{						public class ArrayList<E>{
      	修饰符 返回值类型 方法名(类型 变量名){		  	public E add(E e){ 	
      	}										  }
      }											}
      
  • 泛型方法:

    • 概念:方法中形参类型不确定时;

    • 格式:此处T可以理解为变量,是用来记录数据的类型的,可以写成其他英文字符(最常见为:T、E、K、V);

      ​ 如有多个修饰符,则把类型写在最后一个修饰符后面;

修饰符<类型> 返回值类型 方法名(类型 变量名){	public<T> void show(T t){	public<E> void show(ArrayList<E> list){
}										}							}
  • 泛型接口:

    • 使用方式:

      方式1: 实现类给出具体类型;	写法: public class MyArrayList2 implements List<String>{},String可以换别的类型;
      方式2: 实现类延续泛型, 创建对象时再确定; 写法: public class MyArrayList3<E> implements List<E>{}
      
    • 格式:

      修饰符 interface 接口名<类型>{						public interface List<E>{
      }												 }
      

泛型的继承性和通配符:

继承性: 泛型不具备继承性,但是数据具备继承性:
1.可以再一个指定泛型的集合中添加该泛型的子类数据(数据具备继承性);
2.有一个形参是有指定泛型集合的的方法,该方法只能接收与形参一致的指定泛型集合,不能是该泛型的子类(泛型不具备继承性);

例子:

package com.caihongjia.a03mygenerics;

import java.util.ArrayList;

public class GenericsDemo5 {
    public static void main(String[] args) {
        //泛型不具备继承性,但是数据具备继承性

        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();

        //泛型不具备继承性
        method(list1);
//        method(list2); 报错
//        method(list3); 报错

        // 数据具备继承性
        list1.add(new Ye());
        list1.add(new Fu());
        list1.add(new Zi());
    }
    public static void method(ArrayList<Ye> list) {
    }
}
class Ye { }
class Fu extends Ye { }
class Zi extends Fu { }
通配符:
  • 分类:
1. ?:表示不确定的类型,与E等字符一个作用;
2. ? extends E :	表示可以传递E或者E所有的子类类型;
3. ? super E : 表示可以传递E或者E所有的父类类型;
  • 作用:

    可以用来限定类型的范围
    
  • 例子:

    //                                可以使用Ye类型及其子类
    public static void method(ArrayList<? extends Ye> list) {
    }
    //                                可以使用Ye类型及其父类
    public static void method2(ArrayList<? super Ye> list) {
    }
    //                                可以使用任意类型
    public static void method3(ArrayList<?> list) {
    }
    

综合练习:

  • 要求:

  • 实现:

package com.caihongjia.a04test;

import java.util.ArrayList;
import java.util.Iterator;

public class Test1 {
    public static void main(String[] args) {

        ArrayList<PersianCat> list1 = new ArrayList<>();
        ArrayList<LiHuaCat> list2 = new ArrayList<>();
        ArrayList<Teddy> list3 = new ArrayList<>();
        ArrayList<SiberianHusky> list4 = new ArrayList<>();
    }
/*

    该方法能养所有品种的猫,但是不能养狗
    public static void keepPet(ArrayList<? extends Cat> list){
        for (Cat cat : list) {
            cat.eat();
        }
    }

    该方法能养所有品种的狗,但是不能养猫
    public static void keepPet(ArrayList<? extends Dog> list){
        for (Dog dog : list) {
            dog.eat();
        }
    }

    该方法能养所有的动物,但是不能传递其他类型
    public static void keepPet(ArrayList<? extends Animal> list){
        for (Animal animal : list) {
            animal.eat();
        }
    }

 */
}

标签:ArrayList,list,public,类型,泛型,void
From: https://www.cnblogs.com/chj020415/p/17726082.html

相关文章

  • 【Java 基础篇】Java类型通配符:解密泛型的神秘面纱
    在Java中,类型通配符(TypeWildcard)是泛型的重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符的用法、语法和最佳实践。什么是类型通配符?类型通配符是一个用问号?表示的通配符,它可以用于泛型类、方法和通配符边界。类型通配......
  • 【Java 基础篇】Java 泛型:类型安全的编程指南
    在Java编程中,泛型是一项强大的特性,它允许您编写更通用、更安全和更灵活的代码。无论您是初学者还是有经验的Java开发人员,了解和掌握泛型都是非常重要的。本篇博客将从基础概念一直深入到高级应用,详细介绍Java泛型。什么是泛型?泛型是Java编程语言的一项特性,用于实现通用性更......
  • Ubuntu通过certbot手动配置Let's Encrypt SSL泛型域名证书
    1.安装Snap使用命令安装snap,以及core组件sudoaptinstallsnapdsudosnapinstallcoresudosnaprefreshcore2.移除旧有的certbotsudoapt-getremovecertbotsudodnfremovecertbotsudoyumremovecertbot3.安装certbotsudosnapinstall--classiccertbot......
  • 集合框架和泛型
    1、setHashSet不重复,无序。TreeSet不重复,会自动排序,升序。importjava.util.TreeSet;importjava.util.Set;publicclassTree{publicstaticvoidmain(String[]args){Setset=newTreeSet<>();set.add("GG");set.add("gg")......
  • Java(day20):泛型和枚举
    前言Java是一种面向对象的、跨平台的编程语言,在软件开发中应用广泛。在Java中,泛型和枚举是两种重要的特性,它们能够提高代码的可读性和重用性。本文将介绍Java泛型和枚举的概念、语法、使用方法、测试用例等方面。摘要泛型是Java的一种抽象类型,它允许使用者在编写代码时不指定数......
  • 多个泛型如何设置约束
    提问多个泛型如何设置约束回答publicabstractclassHandleBase<Req,Ack>whereReq:RequestInfoBasewhereAck:AckInfoBase补充泛型优点避免类型转换,可以减少大量继承关系中的as操作......
  • 异常(exception、try-catch)、泛型
    1.Exception和Error有什么区别?在Java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable类有两个重要的子类:Exception:程序本身可以处理的异常,可以通过catch来进行捕获。Exception又可以分为CheckedException(受检查异常,必须处理)和Unc......
  • 委托的总结(包括泛型委托)
    //定义一个委托类型(特殊的引用类型,类似于class)publicdelegateboolMyHandler(intnum,stringname,objectobj)//<inT1,inT2,outTResult>:委托列表//in:关键字,用于描述参数的类型(输入方向)//out:关键字,用于描述返回值的类型(输出方向)//(T1arg1,T2arg2):参数列表。定义时:形......
  • 泛型委托
    泛型委托,直接上例子:publicdelegateTResultFunc<inT1,inT2,outTResult>(T1arg1,T2arg2);1、委托:delegate2、泛型:<inT1,inT2,outTResult>,in关键字表示参数;out关键字表示返回值。PS:对于泛型,模版参数(类型参数)一定要放置在 <> 内部 ......
  • Java泛型对象在http请求和响应对象中的封装
    Java泛型对象在http请求和响应对象中的封装publicclassMySystemBaseResVo<T>{//注意:类的后面需要带上<T>,否则数据无法封装privateStringerr_no;privateStringerr_tips;privateTdata;publicStringgetErr_no(){returnerr_no;}......