首页 > 其他分享 >泛型的使用和介绍

泛型的使用和介绍

时间:2024-10-16 09:32:58浏览次数:1  
标签:void 使用 介绍 class ArrayList demo5 泛型 public

一、泛型的介绍

按照之前的写法,有几个问题
1. 程序中有大量的黄色警告
2. 在遍历的时候,迭代器不知道元素本身的类型,需要向下转型

二、泛型的使用方法

使用泛型[参数化类型]改进集合的使用。
语法格式:<引用数据类型>

public class FanXingDemo1 {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList();//<String>就是泛型,作用是定义了我们后面向ArrayList添加的元素只能是字符串
        //创建元素对象
        //将元素添加到集合中
        list1.add("hello");
        list1.add("world");
        list1.add("java");
        list1.add("hadoop");
        list1.add("hello");
        list1.add("world");
        //list1.add(10);

        Iterator<String> iterator = list1.iterator();
        while (iterator.hasNext()) {
            String s = iterator.next();
            System.out.println(s + "--" + s.length());
        }

    }
}

三、泛型的使用场景

1.在类上使用泛型

泛型是将来用于接收一个引用数据类型的,相当于一个参数
既然是参数,就需要符合标识符的命名规则
一般情况下,使用一个或多个大写字母表示

public class Demo<W> {
    public void fun1(W w) {
        System.out.println("接收到的参数是:" + w);
    }
}

class Test1{
    public static void main(String[] args) {
//        Demo demo = new Demo();
//        demo.fun1("hello");
//        demo.fun1(10);
//        demo.fun1(12.34);


        Demo<String> d1 = new Demo<>();
        d1.fun1("hello");
//        d1.fun1(10);

    }
}

2.在方法上使用泛型

public class Demo1 {
    //泛型方法
    public <Q> void fun1(Q q) {
        System.out.println("接收到的参数是:" + q);
    }

    //普通的方法
    public void fun2(Object obj) {
        System.out.println("接收到的参数是:" + obj);
    }
}

class Test2{
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        demo1.fun1("hello");
        demo1.fun1(100);
    }
}

3.在接口上使用泛型

//泛型接口
public interface Inter1<P> {
    void show1(P p);
}
//继承并重写该接口中的方法
class Inter1Impl<P>implements Inter1<P>{
    @Override
    public void show1(P p) {
        System.out.println("该数据的类型是:"+p);
    }
}
class Test3{
    public static void main(String[] args) {
        Inter1Impl<String> stringInter1 = new Inter1Impl<>();//创建一个具体实现类的对象,并且泛型是String类型
        stringInter1.show1("java");
    }
}

四、泛型通配符的使用场景

泛型通配符:

任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E
向下限定,E及其子类
? super E
向上限定,E及其父类

先简单定义一个动物父类,里面有Dog和Cat子类

public class Animal {
}

class Dog extends Animal {

}

class Cat extends Animal {

}

使用泛型通配符

class Demo5{
    public void show1(Collection<?> c1){
        System.out.println("任意类型泛型通配符");
    }
    // 表示可以传入一个Collection集合,元素的类型是Animal或Animal子类的类型
    public void show2(Collection<? extends Animal> c1){
        System.out.println("元素的类型是Animal或Animal子类的类型");
    }
    // 表示可以传入一个Collection集合,元素的类型是Dog或Dog父类的类型
    public void show3(Collection<? super Dog> c1){
        System.out.println("元素的类型是Dog或Dog的父类");
    }
}
public class Demo4 {
    public static void main(String[] args) {
        Demo5 demo5 = new Demo5();
        ArrayList<Object> objects = new ArrayList<>();
        ArrayList<Animal> animals = new ArrayList<>();
        ArrayList<Dog> dogs = new ArrayList<>();
        ArrayList<Cat> cats = new ArrayList<>();

        demo5.show1(objects);
        demo5.show1(animals);
        demo5.show1(dogs);
        demo5.show1(cats);

//        demo5.show2(objects);//不行,因为? extends E向下限定,E及其子类
        demo5.show2(animals);
        demo5.show2(dogs);
        demo5.show2(cats);

        demo5.show3(objects);
        demo5.show3(animals);
        demo5.show3(dogs);
//        demo5.show3(cats);//不行,因为? super E向上限定,E及其父类
    }

}

标签:void,使用,介绍,class,ArrayList,demo5,泛型,public
From: https://www.cnblogs.com/ndmtzwdx/p/18469016

相关文章

  • 【新人系列】Python 入门(二):Python IDE 介绍
    ✍个人博客:https://blog.csdn.net/Newin2020?type=blog......
  • linux 操作系统下 dpkg-preconfigure 命令介绍和使用案例
    linux操作系统下dpkg-preconfigure命令介绍和使用案例dpkg-preconfigure命令介绍dpkg-preconfigure是Debian和基于Debian的Linux发行版中用于预配置软件包的工具。它允许用户在安装软件包之前,提前提供配置选项,从而简化安装过程。命令格式dpkg-preconfigure[选......
  • c++如何使用pthread_join函数配合pthread_create函数来创建和等待线程完成,实现线程同
    在C++中,pthread_create 和 pthread_join 是POSIX线程库(pthread)的一部分,用于创建和管理线程。pthread_create 用于创建一个新的线程,而 pthread_join 用于等待一个线程的执行完成,从而实现线程同步与控制。基本步骤使用 pthread_create 函数创建一个线程。线程的工作由......
  • C++中如何使用单例模式管理全局变量
    单例模式(SingletonPattern)是一种常用的设计模式,旨在确保一个类只有一个实例,并提供一个全局的访问点。要使用单例模式管理全局变量,可以通过控制类的实例化过程,防止多个对象的创建。这样做不仅可以保证数据一致性,还能避免使用直接的全局变量带来的命名冲突和潜在的多线程安全问题。......
  • IDEA连接数据库后,在使用表的时候有时候未检测到表
    我的这个产生的原因:之前做项目的时候检测到category表了,但后来数据库断开后,等再次连接上数据库,可以检测到数据库,但数据库中的表直接用,是检测不到的。解决方法一:使用数据库中表的时候,可以[数据库.数据库表],如下图所示,可以看到此时使用表就不爆红了。 解决方法二:......
  • 优化远程桌面RDP,使用GPU和帧率60帧
    1.平时在使用远程桌面的时候,会发现无法使用GPU,也就无法运行一些需要独立GPU的应用和游戏。以下为开启方式:在被远程的电脑上运行:开始->运行,输入gpedit.msc(家庭版没有)打开组策略。在左侧导航到以下路径计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机,在右侧选择......
  • Java中Log4j的配置与使用详细解析
    Log4jLog4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件。也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修......
  • XSS漏洞利用实验——使用两种方式外带cookie
    0x00前言关于XSS的基本知识可以查看https://blog.csdn.net/weixin_44656518/article/details/142832967?spm=1001.2014.3001.55010x01使用自建服务器外带数据(反射型XSS)使用实验环境:kali虚拟机,pikachu漏洞实验平台1.查看kali虚拟机ip地址我这里是192.168.80.131不同虚......
  • 使用calibre对电子书合集进行分割
    这里用到calibre的两个插件,分别是EpubSplit和NewDoubanBooks。EpubSplit主要用来分割电子书合集文件,NewDoubanBooks用来为分割后的单本书籍更新元数据(原来的DoubanBooks插件不知道什么原因抓不到元数据)。EpubSplit可以直接从calibre的插件市场直接下载,NewDouban......
  • vue3使用pinia仓库解构赋值响应式丢失的解决方式
    代码storeimport{defineStore}from"pinia";import{ref}from"vue";exportconstuseMyTestStore=defineStore('mytestStore',()=>{//stateconstcount=ref(0);constcount2=ref(1);constincrement2......