泛型基础及深入

泛型深入

泛型定义:

        JDK5引入的特性,可以在编译阶段约束操作的数据类型,并进行检查

泛型格式:

        <数据类型>

        注意:泛型只能支持引用数据类型

优势:

        统一数据类型;

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

Java中的泛型是伪泛型:在编译阶段会检查是否符合要求的数据类型,但是在运行期间又是Object类型(泛型的擦除)

细节:

        泛型中不能写基本数据类型;

        指定泛型的具体类型之后,传递数据时,可以传入该类类型或者子类类型;

        如果不写泛型,类型默认是Object;

泛型类:

        使用场景:

                当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

                

public class ArrayList<E>{

}

                此处的E可以理解为变量,但是不是用来记录数据的,而是记录数据的类型 。

        定义泛型类:

        

package com.lazyGirl.nenericsdemo;

import java.util.Arrays;

public class MyArrayList <E>{

    Object[] objs = new Object[10];

    int size = 0;

    public boolean add(E e){

        objs[size] = e;
        size += 1;
        return true;
    }

    public E get(int index){
        return (E )objs[index];
    }

    @Override
    public String toString(){
        return Arrays.toString(objs);
    }
}

        测试: 

        



public class GenericTest {
    public static void main(String[] args) {
        MyArrayList<String> mal = new MyArrayList<>();
        mal.add("A");
        mal.add("B");

        System.out.println(mal.get(0));
        System.out.println(mal.toString());

        MyArrayList<Integer> mal1 = new MyArrayList<>();
        mal1.add(1);
        mal1.add(2);
        mal1.add(3);

        System.out.println(mal1.get(0));
        System.out.println(mal1.toString());
    }
}

        输出:

        

 泛型方法:

         方法中形参类型不确定时,可以使用类名后面定义的泛型<E>(所有方法都能使用);也可以在方法声明上定义自己的泛型(只有本方法能用)

        格式:

public <T> void show(T t){

}

        此处T可以理解为变量,用来记录类型

        

package com.lazyGirl.nenericsdemo;

import java.util.ArrayList;

public class ListUtils {
    private ListUtils() {}

    public static<E> void addAll(ArrayList<E> list,E...e){
        for (E e1 : e) {
            list.add(e1);
        }
    }
}

        测试:



import java.util.ArrayList;

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

        ArrayList<String> list = new ArrayList<String>();
        ListUtils.addAll(list,"A","B","C","D");
        System.out.println(list);
    }
}

        输出:

         

泛型接口: 

 格式:

public interface List<E>{

}

如何使用:

         方式1:实现类给出具体类型

        方式2:实现类延续泛型,创建对象时再确定

        

package com.lazyGirl.nenericsdemo;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class MyArrayList2 implements List<String> {

    @Override
    public int size() {
        return 0;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public boolean contains(Object o) {
        return false;
    }
    //.....
}

泛型 不具备继承性,但是数据具备继承性



import java.util.ArrayList;

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

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

        method(list1);
        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{}

        或者:

import java.util.ArrayList;

public class GenericDemo3 {
    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);
    }

    public static<E> void method(ArrayList<E> list){

    }
}

泛型的通配符:? 

 ?extends E:表示可以传递E或者E的所有子类类型

? super E: 可以传递E或者E所有的父类类型

        应用场景:

         1. 定义类,方法,接口的时候,类型不确定,就可以定义泛型类,泛型方法,泛型接口

         2。 如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以使用泛型的通配符

        关键点:可以限定类型的范围

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/686423.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb_SpringBootWeb案例

环境搭建&#xff1a; 开发规范 接口风格-Restful&#xff1a; 统一响应结果-Result&#xff1a; 开发流程&#xff1a; 第一步应该根据需求定义表结构和定义接口文档 注意&#xff1a; 本文代码从上往下一直添加功能&#xff0c;后面的模块下的代码包括前面的模块&#xff0c…

WPF入门--多种方式设置样式(Style)

前言 在上篇文章中&#xff0c;介绍了WPF九种布局方式。本篇文章通过多种方式设置样式&#xff08;Style&#xff09;以控制UI元素的外观和行为。下面来具体介绍一下。 传送门 WPF入门--常用布局方式 目录 前言 一、直接在XAML中设置属性&#xff08;内联样式&#xff09…

【机器学习】使用Stable Diffusion实现潜在空间搜索

1、引言 1.1 潜在空间的概念 潜在空间&#xff08;Latent Space&#xff09;是在机器学习和深度学习中一个重要的概念&#xff0c;它指的是用于表示数据的一种低维空间。这个空间编码了数据中包含的所有有用信息的压缩表示&#xff0c;通常比原始数据空间的维数更低&#xff…

Python | Leetcode Python题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution:def singleNumber(self, nums: List[int]) -> int:return reduce(lambda x, y: x ^ y, nums)

攻防世界---misc---津门杯2021-m1

1、题目描述&#xff0c;下载附件是一张bmp格式的图片 2、直觉告诉我这和图片的颜色通道有关 3、于是我就尝试用stegslove打开图片 4、将颜色通道都改为0&#xff0c;点击preview 5、然后发现一串base64编码 6、解码得flag flag{l5DGqF1pPzOb2LU919LMaBYS5B1G01FD}

CSS真题合集(一)

CSS真题合集&#xff08;一&#xff09; 1. 盒子模型1.1 盒子模型的基本组成1.2 盒子模型的实际大小1.3 盒子模型的两种类型1.4 设置盒子模型1.5 弹性盒子模型 2. BFC2.1 主要用途2.2 触发BFC的方法2.2 解决外边距的塌陷问题&#xff08;垂直塌陷&#xff09; 3. 响应式布局3.1…

某铁路信息中心运营监测项目

某铁路信息中心承担大量实时监测、例行巡检和排障维护等工作&#xff0c;为巩固信息化建设成果&#xff0c;提高整体运维效果&#xff0c;保障铁路信息系统稳定运行&#xff0c;需对现有网络监测系统进行升级改造。 设备类型&#xff1a;服务器、交换机、数据库、中间件、虚拟…

每日一题遇到沙比题目——Python实现PAT甲级1061 Dating(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 吐槽题目 我的写法 代码分析 1. 输入处理 2. 变量初始化 3. 查找星期几和小时 4…

Qt for android : 调用 OpenCV库错误集(To Be Continue)

error: error: undefined symbol: AMediaExtractor_new 在调用 VideoCapture等库时出现 解决: LIBS -lmediandk

UE5-AI

AI角色 角色控制器 AI角色必须要一个角色控制器 角色控制器最基本只需要执行行为树&#xff0c;在EventOnPossess后runBehaviorTree 如果要的是一个角色&#xff0c;可以创建一个Character&#xff0c;在类默认设置中可以找到 Pawn->AIControllerClass&#xff0c;在这里…

Golang | Leetcode Golang题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; func singleNumber(nums []int) int {single : 0for _, num : range nums {single ^ num}return single }

Flink任务如何跑起来之 1.DataStream和Transformation

Flink任务如何跑起来之 1.DataStream和Transformation 1. 滥觞 在使用Flink完成业务功能之余&#xff0c;有必要了解下我们的任务是如何跑起来的。知其然&#xff0c;知其所以然。 既然重点是学习应用程序如何跑起来&#xff0c;那么应用程序的内容不重要&#xff0c;越简单…

动手学深度学习——Kaggle小白入门

1. kaggle注册 注册网址&#xff1a;https://www.kaggle.com 注册账号不需要代理&#xff0c;但手机号验证需要代理。如果要使用GPU或TPU&#xff0c;则需要进行手机号验证。 手机号验证位置&#xff1a;右上角头像的settings界面。 手机号验证时会有几个问题&#xff1a; …

【栈】1096. 花括号展开 II

本文涉及知识点 栈 LeetCode 1096. 花括号展开 II 如果你熟悉 Shell 编程&#xff0c;那么一定了解过花括号展开&#xff0c;它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串&#xff0c;定义下面几条语法规则&…

服务器数据恢复—raid5阵列磁盘坏道离线导致数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌x3850 X5服务器&#xff0c;服务器上有一组由5块硬盘组建的raid5阵列&#xff08;包含一块热备盘&#xff09;&#xff0c;安装linux操作系统&#xff0c;运行oracle数据库。 服务器故障&#xff1a; 服务器上raid5阵列中两块硬盘由于未…

【Linux操作系统】进程状态(1)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 Linux操作系统 进程状态 的相关内容。 如果看到最后您觉得这篇文章…

HDFS 之 DataNode 核心知识点

优质博文&#xff1a;IT-BLOG-CN 一、DataNode工作机制 DataNode工作机制&#xff0c;如下所示&#xff1a; 【1】一个数据块在 DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c…

Codeforces Round 951 (Div. 2)(A~C)

目录 A. Guess the Maximum B. XOR Sequences C. Earning on Bets 这次比赛也是打的稀碎了&#xff0c;第二个少个break检查了15分钟才检查出来&#xff0c;第三个符号搞错了&#xff0c;错了两次&#xff0c;道心直接破碎了 A. Guess the Maximum 题意&#xff1a;我们对…

计算机组成原理-cache详解

一、Cache的概念和原理 1、cache原理 2、cache性能分析 一道例题 3、cache和主存数据交换的单位 每次访问到的主存块会立即放入cache中 小结 二、cache和主存之间的映射关系 全相联映射 全相联访存过程 直接映射 组相联映射 小结 三、cache替换算法 在直接映射中&#xff0c…

webgl_framebuffer_texture

ThreeJS 官方案例学习&#xff08;webgl_framebuffer_texture&#xff09; 1.效果图 2.源码 <template><div><div id"container"></div><div id"selection"><div></div></div></div> </templa…