首页 > 编程语言 >2Java加强-----泛型

2Java加强-----泛型

时间:2024-08-21 11:23:06浏览次数:8  
标签:String ArrayList list add ----- 泛型 new public 2Java

1.认识泛型

public class GenericDemo1 {
    public static void main(String[] args) {
        // 目标:认识泛型,搞清楚使用泛型的好处。
        ArrayList list = new ArrayList();
        list.add("java");
        list.add("php");
        list.add(23);
        list.add(99.9);
        list.add(true);
        list.add('a');
        list.add(new Object());


        // 获取数据。
        for (int i = 0; i < list.size(); i++) {
            Object rs = list.get(i);
            // 把数据转型处理。
            String s = (String) rs;
            System.out.println(s);


        }
    }
}

观察上面代码,当处理到整数类型时就会报错.而且每次都要强制转型,麻烦,因此引出泛型

public class GenericDemo1 {
    public static void main(String[] args) {
        // 目标:认识泛型,搞清楚使用泛型的好处。
        ArrayList<String> list = new ArrayList<String>();
        list.add("java");
        list.add("php");
//        list.add(23);
//        list.add(99.9);
//        list.add(true);
//        list.add('a');
//        list.add(new Object());


        // 获取数据。
        for (int i = 0; i < list.size(); i++) {
//            Object rs = list.get(i);
//            // 把数据转型处理。
//            String s = (String) rs;
//            System.out.println(s);

            String s = list.get(i);
            System.out.println(s);
        }
    }
}

2.泛型接口

//定义学生类
public class Student {
    
}

public interface Operate<T> {
    void add(T t);
    void delete(T t);
    void update(T t);
    T query(int id);
}
public class StudentOperate implements Operate<Student>{

    @Override
    public void add(Student student) {

    }

    @Override
    public void delete(Student student) {

    }

    @Override
    public void update(Student student) {

    }

    @Override
    public Student query(int id) {
        return null;
    }
}
public class Test {
    public static void main(String[] args) {
        StudentOperate studentOperate = new StudentOperate();
        studentOperate.add(new Student());
        studentOperate.add(new Student());
        studentOperate.add(new Student());

    }
}

3.泛型方法

public class Test {
    public static void main(String[] args) {
        String[] strs = {"1", "2", "3"};
        Student[] students = new Student[4];
        print(strs);
        String s = getMax(strs);
        Student student = getMax(students);
    }

    public static <T> void print(T t) {

    }

    public static <T> T getMax(T[] t) {
        return null;
    }
}

4.通配符

public class GenericDemo5 {
    public static void main(String[] args) {
        // 目标:理解通配符和上下限。
        ArrayList<Xiaomi> xiaomis = new ArrayList<>();
        xiaomis.add(new Xiaomi());
        xiaomis.add(new Xiaomi());
        xiaomis.add(new Xiaomi());
        go(xiaomis);

        ArrayList<BYD> byds = new ArrayList<>();
        byds.add(new BYD());
        byds.add(new BYD());
        byds.add(new BYD());
        go(byds);

//        ArrayList<Dog> dogs = new ArrayList<>();
//        dogs.add(new Dog());
//        dogs.add(new Dog());
//        dogs.add(new Dog());
//        go(dogs);
    }

    // 需求:开发一个极品飞车的游戏。
    // 虽然Xiaomi和BYD是Car的子类,但是 ArrayList<Xiaomi>  ArrayList<BYD>和 ArrayList<Car> 是没有半毛钱关系!
    public static void go(ArrayList<? extends Car> cars) {
    }
}

5.泛型支持的类型

那么泛型为什么不支持基本数据类型呢?

来看下面这段代码

 // 目标:搞清楚泛型和集合不支持基本数据类型,只能支持对象类型(引用数据类型)。
         ArrayList<int> list = new ArrayList<>();
        // 泛型擦除:泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后都会被擦除。所有类型会恢复成Object类型
         list.add(12);
         Object a=12;

特殊方法经过反编译,ArrayList这个类型最终会编译为Object类型,而Object类型必须指向对象

如果支持基本数据类型的话,ArrayList可以加12进去,编译完后,底层是用Object来接,也就意味着你把12交给object,而object只能指向对象,而12不是对象,所以不行

5.1包装类

但是总得用基本数据类型吧,这样就引出了包装类

 // 把基本数据类型变成包装类对象。
        // 手工包装:
        // Integer i = new Integer(100); // 过时
        Integer it1 = Integer.valueOf(100);  // 推荐的

// 自动装箱成对象:基本数据类型的数据可以直接变成包装对象的数据,不需要额外做任何事情
        Integer it11 = 130;
        Integer it22 = 130;
        System.out.println(it11 == it22);

        // 自动拆箱:把包装类型的对象直接给基本类型的数据
        int i = it11;
        System.out.println(i);

 ArrayList<Integer> list = new ArrayList<>();
        list.add(130);  // 自动装箱
        list.add(120);  // 自动装箱
        int rs = list.get(1); // 自动拆箱

// 1、把基本类型的数据转换成字符串。
        int j = 23;
        String rs1 = Integer.toString(j);   // "23"
        System.out.println(rs1 + 1); // 231

        Integer i2 = j;
        String rs2 = i2.toString(); // "23"
        System.out.println(rs2 + 1 ); // 231

        String rs3 = j + "";
        System.out.println(rs3 + 1 ); // 231

  // 2、把字符串数值转换成对应的基本数据类型(很有用)。
        String str = "98";
        // int i1 = Integer.parseInt(str);
        int i1 = Integer.valueOf(str);
        System.out.println(i1 + 2);

        String str2 = "98.8";
//        double d = Double.parseDouble(str2);
        double d = Double.valueOf(str2);
        System.out.println(d + 2);

标签:String,ArrayList,list,add,-----,泛型,new,public,2Java
From: https://blog.csdn.net/a1209083572/article/details/141369013

相关文章

  • Python-终端输出带有颜色的文本
    在Python中,异常信息默认是打印到终端的,而终端显示的文字颜色通常由终端或者是使用的shell决定。如果你想要在try-except块中捕获到异常时,让异常信息以黄色文本的方式显示,你可以使用一些终端控制码(ANSIescapecodes)来改变文本颜色。以下是一个简单的示例,展示了如何在捕获到异常时......
  • C++类模板案例-数组类封装
    #include<iostream>usingnamespacestd;template<classT>classMyArray{public: MyArray(intcapacity) { this->m_Capacity=capacity; this->m_Size=0; this->pAddress=newT[this->m_Capacity]; } ~MyArray() { if(th......
  • 前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size
    使用rem单位与动态设置html的font-size前言随着设备尺寸的多样化,网页需要能够在不同大小的屏幕上提供良好的用户体验。传统的布局方式(如使用px)在不同分辨率下可能会导致布局失真。为了解决这个问题,我们可以通过动态设置html元素的font-size并使用rem单位来构......
  • ArkTS---http数据请求
    前言:    要使用http请求,需在module.json5文件中添加网络管理权限"module":{"requestPermissions":[{"name":"ohos.permission.INTERNET"}]}一、使用步骤    1、导入http模块        HTTP数据请求功能主要由http模块......
  • ArkTS---保存应用数据
    前言---Preferences    用户首选项Preferences,适用于对轻量级的Key-Value结构的数据进行存取和持久化操作。    Key-Value数据结构:一种键值型的数据结构,Key是不重复的关键字,Value是数据值。    非关系型数据库:区别于关系型数据库,不保证遵循ACID特性......
  • MBR30100CT-ASEMI低压降肖特基MBR30100CT
    编辑:llMBR30100CT-ASEMI低压降肖特基MBR30100CT型号:MBR30100CT品牌:ASEMI封装:TO-220批号:最新恢复时间:35ns最大平均正向电流(IF):30A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0.90V工作温度:-65°C~175°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):250AMBR30100CT特......
  • jian-li-blog
    建立自己的博客网站来装逼是不错的方式,在没有代码基础的情况下,Github可以提供免费的网站服务,你只需要有一个GitHub账号就可以了(注意GitHub需要用邮箱注册),在注册完成剩下的就按接下的步骤就行了1相关工具安装1.Node环境Hexo是基于Node.js驱动的一款博客框架,所以要先安装No......
  • VSCode系列 - 如何用VSCode搭建C++高效开发环境(2)
    1.插件的用法1.1.C/C++1.1.1.插件介绍1.1.2.插件配置1.2.Clang-Format1.3.cpp-check-lint1.3.1.cpplint1.3.2.cppcheck1.3.3.插件的使用1.4.C/C++AdvancedLint1.4.1.插件介绍1.4.2.插件配置1.5.BracketPairColorizer1.5.1.插件介绍1.......
  • WiFi简介-从技术原理到应用
    推荐:揭秘电池管理的全能王者,ADI车规级AFE芯片(Bipolar+CMOS双管芯)芯品快报:德州仪器(TI)的高性能、集成式的双全桥电机驱动器——DRV8412“做成ADC拿去诡市,贱卖!”-----长安红茶续篇WiFi简介-从技术原理到应用原创 IPBrain 集成电路大数据平台 2022年07月29日17:18 北京......
  • X-anylabeling如何手动加载(自定义)模型 : 以Segment Anything 为例
    提示:文章目录前言1手动下载模型至软件默认读取路径2加载自定义模型假设你已有模型(.pth),如何进行导出安装导出工具导出你的模型,在标注软件中加载模型打开软件,加载‘自定义’模型。并选择上面提到的配置文件X-anylabeling源码安装过程中遇到的问题GPU环境问题opencv......