Java基础——泛型

避坑指南:LISFLOOD-FP模型数据单位、参数文件与results文件夹结果解析全攻略 本文详细解析了LISFLOOD-FP洪水模拟模型的关键应用环节,包括数据单位校验、参数文件优化及结果文件解读与可视化。特别针对常见的单位混淆问题,提供了从DEM到边界条件的全面校验方法,并深入剖析了.par参数文件的配置技巧,帮助用户避免模型崩溃和结果失真。 阅读详情
  • 为什么使用泛型?
        List list1 = new ArrayList();
        list1.add("Droy");
        list1.add(36);

        for(int i = 0; i < list1.size();i++){
            //抛出异常:
            //java.lang.ClassCastException: 
            //java.lang.Integer cannot be cast to java.lang.String
            String data1 = (String)list1.get(i);
            //由于数据放入时没有明确类型,而取出时不清楚数据类型导致的。
        }

        //a.2.使用泛型示例
        List<String> list2 = new ArrayList<String>();
        list2.add("Droy");
        //list2.add(36);//直接报错,因为List<String>限定了类型只能是String。

在上述示例中,我们可以直观感受下泛型最普遍的用法,通过定义List接口的类型实参为String,限制了放入的数据类型,就可以避免取出数据时的异常。泛型可以简化我们的代码开发,保证代码质量。更多的用法需要理解泛型后灵活运用。

  • 泛型定义

泛型,就是参数化类型,常见到泛型接口/类、泛型方法,常用T、K、E、V定义类型形参。
例如,List接口源代码:

public interface List<E> extends Collection<E> {
    int size();

    boolean isEmpty();

    boolean contains(Object var1);

    Iterator<E> iterator();

    Object[] toArray();

    <T> T[] toArray(T[] var1);

    boolean add(E var1);

    boolean remove(Object var1);

    boolean containsAll(Collection<?> var1);

    boolean addAll(Collection<? extends E> var1);

    boolean addAll(int var1, Collection<? extends E> var2);

    boolean removeAll(Collection<?> var1);

    boolean retainAll(Collection<?> var1);

    default void replaceAll(UnaryOperator<E> var1) {
        Objects.requireNonNull(var1);
        ListIterator var2 = this.listIterator();

        while(var2.hasNext()) {
            var2.set(var1.apply(var2.next()));
        }

    }

    default void sort(Comparator<? super E> var1) {
        Object[] var2 = this.toArray();
        Arrays.sort(var2, var1);
        ListIterator var3 = this.listIterator();
        Object[] var4 = var2;
        int var5 = var2.length;

        for(int var6 = 0; var6 < var5; ++var6) {
            Object var7 = var4[var6];
            var3.next();
            var3.set(var7);
        }

    }

    void clear();

    boolean equals(Object var1);

    int hashCode();

    E get(int var1);

    E set(int var1, E var2);

    void add(int var1, E var2);

    E remove(int var1);

    int indexOf(Object var1);

    int lastIndexOf(Object var1);

    ListIterator<E> listIterator();

    ListIterator<E> listIterator(int var1);

    List<E> subList(int var1, int var2);

    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 16);
    }
}

List<E>中E是类型形参,而接口实现中List<String>中String就是类型实参。同时,我们可以注意到List接口中有很多方法也定义了类型形参E,它们将与接口实现传入的类型实参保持一致。

  • 泛型定义的类的类型比较

我们先来思考一个问题,如果我们定义了一个泛型类Person,此时我们实例化两个不同类型实参的对象,他们是否属于同一类型,具体代码如下:

public class GenericsDemo {

    static class Person<T> {

        private T attribute;

        public Person(T attribute){
            setAttribute(attribute);
        }

        public T getAttribute() {
            return attribute;
        }

        public void setAttribute(T attribute) {
            this.attribute = attribute;
        }
    }

    public static void main(String[] args) {                
        //B.泛型定义的类的类型比较
        Person<String> name = new Person<String>("Droy");
        Person<Integer> age = new Person<Integer>(36);

        System.out.println("name值:"+name.getAttribute());
        System.out.println("age值:"+age.getAttribute());
        System.out.println("类的比较:"+(name.getClass()==age.getClass()));
    }

}
输出结果:
name值:Droy
age值:36
类的比较:true

通过上述试验,我们发现虽然泛型传递的类型实参不同,但是基本类型是相同的。为什么?因为java中泛型只是在编译过程中使用,编译通过后泛型信息就会被去除,运行时只有原始类型。
因此,只要能绕过编译过程,直接通过反射方式就可以向泛型集合中加入其他类型的数据。

        Person<String> name = new Person<String>("Droy");
        Person<Integer> age = new Person<Integer>(36);

        System.out.println("name值:"+name.getAttribute());
        System.out.println("age值:"+age.getAttribute());
        System.out.println("类的比较:"+(name.getClass()==age.getClass()));
        
        try{
            age.getClass().getMethod("setAttribute",Object.class).invoke(age,"Zhou");
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("age.invoke值:"+age.getAttribute());
输出结果:
name值:Droy
age值:36
类的比较:true
age.invoke值:Zhou

age对象本来定义的类型实参是Integer类型,可通过反射绕开编译过程后,我们使它的值变成了String类型的。

  • 泛型类型通配符?

我们在形式上用?代替具体的类型实参,逻辑上可以认识为是所有类型的父类。

public class GenericsDemo {

    static class Person<T> {

        private T attribute;

        public Person(){

        }

        public Person(T attribute){
            setAttribute(attribute);
        }

        public T getAttribute() {
            return attribute;
        }

        public void setAttribute(T attribute) {
            this.attribute = attribute;
        }
    }


    //定义获取数据方法
    public static void getData1(Person person){
        System.out.println("人的属性: "+person.getAttribute());
    }

    public static void getData2(Person<?> person){
        System.out.println("人的属性: "+person.getAttribute());
    }

    public static void getData3(Person<Integer> person){
        System.out.println("人的属性: "+person.getAttribute());
    }

    public static void main(String[] args) {

        Person<String> name = new Person<String>("Droy");
        Person<Integer> age = new Person<Integer>(36);

        //C.泛型类型通配符?
        getData1(name);
        getData1(age);

        getData2(name);
        getData2(age);

//        getData3(name);//直接报错
        getData3(age);
    }

}

如上述代码中所见,方法getData2(Person<?> person)使用通配符来代替具体类型实参,这样我们调用时传递的就不在受到实参的局限性,这也满足了我们对代码多态性的需求,不必为每一个实参定义一个新的函数。

  • 泛型通配符上下限

这是泛型通配符的扩展,主要用于将实参范围固定在某个特定区间。

泛型通配符上限,形式< ? extends 父类>。

比如,Person<? extends Number>,我们要将类型实参的上限定义在Number下,即通配符?代表的类型实参必须是继承Number父类的。


public class GenericsDemo {

    static class Person<T> {

        private T attribute;

        public Person(){

        }

        public Person(T attribute){
            setAttribute(attribute);
        }

        public T getAttribute() {
            return attribute;
        }

        public void setAttribute(T attribute) {
            this.attribute = attribute;
        }
    }

    //类型通配符上限
    public static void getData4(Person<? extends Number> person){
        System.out.println("人的属性: "+person.getAttribute());
    }

    public static void main(String[] args) {

        Person<String> name = new Person<String>("Droy");
        Person<Integer> age = new Person<Integer>(36);

        //D.类型通配符上限
        Person<Number> statrue = new Person<Number>(176);

//        getData4(name);//直接报错
        getData4(age);
        getData4(statrue);
    }

}

上述示例中如果类型实参不是继承Number的则会直接报错,如getData4(name)。

泛型通配符下限,< ? super 子类>。

比如,Person<? super Byte>,我们要将类型实参的下限定义在byte上,即通配符?代表的类型实参必须是Byte及其父类。

public class GenericsDemo {

    static class Person<T> {

        private T attribute;

        public Person(){

        }

        public Person(T attribute){
            setAttribute(attribute);
        }

        public T getAttribute() {
            return attribute;
        }

        public void setAttribute(T attribute) {
            this.attribute = attribute;
        }
    }

    //类型通配符下限
    public static void getData5(Person<? super Byte> person){
        System.out.println("人的属性: "+person.getAttribute());
    }

    public static void main(String[] args) {
        Person<String> name = new Person<String>("Droy");
        Person<Integer> age = new Person<Integer>(36);
        Person<Number> statrue = new Person<Number>(176);

        //E.类型通配符下限
//        getData5(name);//直接报错
//        getData5(age);//直接报错
        getData5(statrue);

    }
}

上述示例中如果不是Byte的父类的类型实参就会报错。

【YOLOv13[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等 本文将进行添加YOLOv13版本的升级版热力图可视化功能的实践,支持图像热力图可视化、优化可视化效果、 可以选择使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一个参数即可设置是否显示检测框等。 阅读详情

相关推荐

全球半导体设备氧化钇熔射服务行业规模预测:预计未来六年CAGR为7.8%

本文将对“半导体设备氧化钇熔射服务”行业进行深度分析,探讨市场趋势的演变、核心竞争者的战略布局、供应链结构的内外特点、研发创新的最新进展、法规政策环境的适应性调整以及投资机会与风险评估。这一稳健的增长趋势表明半导体设备氧化钇熔射服务在电子行业中的重要性逐渐增强。由于全球对于高效、高精度和可靠的电子解决方案的需求增加,对能够提供这些功能的半导体设备氧化钇熔射服务的需求日益增长。由于半导体设备氧化钇熔射服务主要为就地服务型,其“配送”主要依赖于专业团队和技术设备的及时调配,强调服务的时效性和高质量。

CC1239777的博客 570

JAVA基础(集合进阶) —— 泛型

泛型、泛型类、泛型方法、泛型接口以及 泛型的继承和通配符

hdakj22的博客 1262

电路研究9.4——合宙Air780EP的LuatOS、CSDK跟标准AT

 C-SDK、AT指令、LuatOS

esmember的博客 1116

Java 中的泛型(超全详解)

泛型的出现就是为了统一集合当中数据类型的尖括号 <> 中的 泛型标识被称作是类型参数,用于指代任何数据类型。T :代表一般的任何类。E :代表 Element 元素的意思,或者 Exception 异常的意思。K :代表 Key 的意思。V :代表 Value 的意思,通常与 K 一起配合使用。S :代表 Subtype 的意思,文章后面部分会讲解示意。自己实现集合/*E: 表示不确定的类型,该类型在类名后面已经定义过了e: 形参的名字,变量名*/

weixin_65752158的博客 3万+

保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制

本文提供了一份详细的K230开发板与张大头步进电机的控制教程,涵盖硬件连接、协议解析、模块化代码实现及实战案例。通过位置、速度和回零功能的全面讲解,帮助开发者快速掌握步进电机的高级控制技术,适用于自动化、机器人等应用场景。

weixin_42629671的博客 710

ADS1220 STM32硬件SPI驱动程序

前一段时间温故了下标准库,使用的是F1系列芯片,测试程序。

随风飘零翼的博客 5770

java基础——泛型

Java的泛型是JDK5引入的新特性,虚拟机是不支持泛型的,为了向下兼容,Java实现的其实是一种。

liang-jy的博客 1851

STM32 Proteu直流电机正反转控制系统限位开关-0035

硬件组成:STM32F103C6单片机 +L298N电机控制电路+直流电机+3个按键(正转、反转、停止)+LED指示灯(正转、反转、停止)+限位开关(正限位 反限位) 1.通过3个按键(正转、反转、停止)控制电机的正转、反转、停止。 2.有3个LED指示灯,正转时正转指示灯亮。反转停止对应反转停止指示灯亮。 3.有自动正转反转停止功能,正转时当正限位按键按下时说明正转到最大距离。此时自动停止。反转一样。

zhaxiaobian_er的博客 2002

Java泛型详解(史上最全泛型知识详解)

泛型是在JDK5之后引入的一个新特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式为用大白话来说,泛型就好比是给一个标签,通常情况下我们会在开发过程中或者个人学习或练习的过程中使用到泛型;就拿数组的泛型举例来说,我们把数组比作一个药瓶子,我们药瓶子贴上了什么标签,就只能放什么药,如果不管什么药都放在一个药瓶子里,那不得出大事吗?同样容器(数组)写上什么泛型,就只能存放什么数据;这样就不会导致我们存取数据的混乱。这样就解决了我们引言中提到的问题,也就解释了什么是泛型。

m0_70325779的博客 1万+

【unity游戏开发入门到精通——UGUI】UI控件 —— Toggle开关切换控件

【unity游戏开发入门到精通——UGUI】UI控件 —— Toggle开关切换控件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1845

微信终于支持“多设备同时在线”?我用 NAS + Docker 搭了一个云端微信系统,多端共享24小时在线

通过Docker 容器,将微信运行在云端并通过浏览器访问,实现多设备共享同一微信会话 📱。本文详细介绍完整部署流程、docker-compose 配置及资源控制方案,让微信变成“可访问的云桌面应用” ✨

XiaoqiangClub的博客 870

【Java基础】6.泛型

Java泛型机制

Maxbao0401的博客 1245

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4654

【java基础】Java 泛型

在 Java 编程的世界里,泛型是一项极具魅力的特性。它如同一位神奇的魔法师,赋予代码更高的灵活性、更强的类型安全性以及更好的可维护性。借助泛型,我们能够编写出更加通用的代码,避免为不同的数据类型重复编写相似的逻辑。泛型,简而言之,就是参数化类型。它允许我们在定义类、接口或方法时,使用一个或多个类型参数来替代具体的数据类型。这些类型参数在实际使用时会被具体的类型所替换,从而实现代码的复用。泛型类是在定义类时使用类型参数的类。类型参数通常用大写字母表示,常见的有T(Type)、K(Key)、V。

小李同学的博客 1545

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java基础 泛型

本文主要介绍的java基础中的泛型的相关知识,包括泛型的介绍和用法

m0_75209145的博客 624

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JAVA基础之泛型

Java基础知识泛型分享

王文强 1695

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java泛型终极指南:从基础到高级应用

泛型(Generics)是Java SE 5.0引入的一个重要特性,它允许在定义类、接口和方法时使用类型参数(Type Parameters)。泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。专业解释:泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗理解:就像方法有参数一样,泛型让类型也可以作为"参数"传递。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1277

java 泛型基本类型时_Java基础之泛型

一、泛型的理解与简单使用泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这...

weixin_39936558的博客 628

泛型-Java泛型基础

面向对象相对于面向过程而言,是软件领域的

喻红叶 930

Java基础之泛型机制介绍

在计算机科学中,泛型是一种编程语言的特性,它允许开发者在定义类、接口或方法时引入类型参数,以实现对多种数据类型的支持。通过这种机制,开发者能够在保证类型安全的前提下设计出更具通用性和灵活性的代码。泛型的核心目标是增强代码的抽象能力,使其能够适应多样化的数据类型和需求场景,而无需牺牲类型的严谨性。从根本上看,泛型的定义是基于参数化类型的思想,它允许在编译期通过具体的类型来实例化参数化的代码结构。

道可道非常道 1549

Java基础之泛型

泛型1.基础概念2使用泛型的原因2.1当不使用泛型时2.2当使用泛型时 1.基础概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。 从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,正如:List< String>,这表明该

smilecb的博客 293

Java:泛型基础

泛型 引入泛型 传统编写的限制:   在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型。如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的三种方法: 1.多态:将方法的参数类型设为基类,那么该方法就可以接收从这个基类导出的任何类作为参数。 class Primary{} //定义基类 cla

悠悠的博客 381

Java基础(二十):泛型

在JDK5.0之前只能把元素类型设计为ObjectJDK5.0时Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时指定集合元素的类型所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值或参数的类型这种语法形式就叫泛型的形式我们称为类型参数,这里的"类型"习惯上使用T表示,是Type的缩写。即::代表未知的数据类型,我们可以指定为,,等。

从基础到源码解析的学习记录 1509

Java之泛型基础

从这里开始再次回顾一下java基础,目的是再次深入一点学习,不是教程,主要以相关知识的重点为主,有时候可能有较强的偏向性,所以可能会遗漏一些基础概念或者之类的东西。泛型学习笔记上篇,主要记录java泛型相关基础,包括为什么引入泛型,泛型的使用方式,以及在JDK或框架中的典型应用。

Oscar Chen 2327

Java基础:泛型编程基础

java也要考试,对几个不太熟悉的知识点先进行整理,假期会系统的对每块知识进行整理顺带吐槽一下,手写代码的方式考核真的很让人排斥,也很让人头疼!!!!本博文为记录且仅为记录学习,不作商业用途。其中部分内容来自海贼宝藏课程,笔者仅为加深印象和系统性以笔记形式呈现,若有侵权请联系作者删除。

m0_67314592的博客 1300

Java基础学习之泛型的使用

Java基础学习之泛型的使用 文章目录Java基础学习之泛型的使用前言一、泛型是什么?二、泛型的三种常见使用1.泛型类2.泛型方法3.泛型接口总结 前言 本文记录了作者学习泛型的内容。 一、泛型是什么? 泛型是一种未知的数据类型,当我们不确定使用什么数据类型时使用泛型。 泛型也可以看作是一种变量,用来接收数据类型。 例如,在我们定义集合的时候,不确定集合中存储的数据类型,所以需要使用泛型。 二、泛型的三种常见使用 1.泛型类 在类名后加<泛型>。 注意:一个类是泛型类不代

weixin_45855864的博客 239
上一篇: Java基础——final关键字
下一篇: Java基础—执行优先级—静态代码块 / 构造代码块 / 构造函数 / 父子级有参无参构造函数
Droy`Z
博客等级 码龄19年 75粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值