泛型、泛型上限、泛型下限、泛型通配符

server/2025/3/10 11:17:11/

DAY8.1 Java核心基础

泛型在这里插入图片描述

Generics 是指在类定义时不指定类中信息的具体数据类型,而是用一个标识符来代替,当外部实例化对象时再指定具体的数据类型。

在定义类或者接口时不明确指定类中信息的具体数据类型,在实例化时再来指定具体的数据类型

极大地提升了类的扩展性,一个类可以装载各种不同的数据类型

泛型可以指代类中的成员变量数据类型,方法的返回值数据类型以及方法的参数数据类型。

基本使用:

定义一个Demo不指定类中的具体数据类型,用标识符代替

java">public class Demo<T>{private T t;public Demo(T t) {this.t = t;}public T getT() {return t;}public void setT(T t) {this.t = t;}
}
java">public static void main(String[] args) {Demo<String> hello = new Demo<>("hello");System.out.println(hello.getT());Demo<Integer> integerDemo = new Demo<>(11);System.out.println(integerDemo.getT());
}

输出:
image-20250309103252419

泛型也可以同时写多个泛型

java">public class Demo<T,A,B>{private T t;private A a;private B b;public Demo(T t, A a, B b) {this.t = t;this.a = a;this.b = b;}@Overridepublic String toString() {return "Demo{" +"t=" + t +", a=" + a +", b=" + b +'}';}
}
java">public static void main(String[] args) {Demo<String, Integer, Float> hello = new Demo<>("hello", 1, 2.0f);System.out.println(hello);
}

image-20250309103908102

泛型通配符<?>:在不确定传入的数据类型的时候可以使用通配符

java">public static void main(String[] args) {ArrayList<Integer> integers = new ArrayList<>();test(integers);ArrayList<String> strings = new ArrayList<>();test(strings);
}
public static void  test(ArrayList<?> list) {System.out.println(list);
}

比如传入的参数是Interger类型和String类型,如果定义ArrayList list作为形参则String类型的数组无法传递

泛型的上限和下限

上限:类名<? extends A> 这个类型必须是A类的子类或者A类型本身
下限:类名<? super A> 这个类型必须是A类的父类或则A类型本身

java">public class Test {public static void main(String[] args) {ArrayList<Double> doubles = new ArrayList<>();doubles.add(1.0);test1(doubles);ArrayList<Object> strings = new ArrayList<>();strings.add("hello");test2(strings);}/*** 标识test1方法的list参数的类型是Number的子类或者是Number本身,比如 Integer、Double、Float...* @param list*/public static void test1(ArrayList<? extends Number> list) {System.out.println(list);}/*** 表示test2方法的list参数的类型是String的父类或者是String本身,String or Object* @param list*/public static void test2(ArrayList<? super String> list) {System.out.println(list);}
}

泛型接口

java">public interface MyInterface<T> {public T test();
}

实现类:

java">public class MyInterfaceImpl1 implements MyInterface<String>{public String t;public MyInterfaceImpl1(String t) {this.t = t;}@Overridepublic String test() {return t;}
}
java">public class MyInterfaceImpl2<T> implements MyInterface<T>{public T t;public MyInterfaceImpl2(T t) {this.t = t;}@Overridepublic T test() {return t;}
}

两个实现类,一个在实现的时候就定义了类型,一个没有定义,所以MyInterfaceImpl1就不能在使用的时候指定其它类型对象,就只能使用String类型

image-20250309110134125

正确测试代码:

java">public static void main(String[] args) {MyInterfaceImpl1 myInterfaceImpl1 = new MyInterfaceImpl1("123");System.out.println(myInterfaceImpl1.test());MyInterfaceImpl2<Integer> myInterfaceImpl2 = new MyInterfaceImpl2<>(123);System.out.println(myInterfaceImpl2.test());
}

http://www.ppmy.cn/server/173918.html

相关文章

基于单片机的室外休闲智能座椅设计(论文+源码)

1系统总体设计 本课题为基于单片机的室外休闲智能座椅的设计&#xff0c;其可以实现温湿度检测&#xff0c;座椅加热&#xff0c;自动照明&#xff0c;背靠调节等工作。整个系统架构如图2.1所示其中包括了按键模块&#xff0c;温湿度检测模块&#xff0c;显示模块&#xff0c;加…

[FE] React 初窥门径(五):React 组件的加载过程(commit 阶段)

1. 回顾 前一篇文章我们看到&#xff0c;ReactDOM.render 总共包含这些步骤&#xff0c; 然后介绍了 performSyncWorkOnRoot 做的事情&#xff0c;它主要做了两件事&#xff0c; renderRootSync 可称之为 render 阶段&#xff1a;创建了一颗 Fiber Tree&#xff08;包含 html …

【HarmonyOS Next】鸿蒙应用故障处理思路详解

【HarmonyOS Next】鸿蒙应用崩溃处理思路详解 一、崩溃问题发现后定位 1. 崩溃现象&#xff1a; 常见的崩溃问题表现为&#xff0c;应用操作后白屏闪退&#xff0c;或者应用显示无响应卡死。 2.定位问题&#xff1a; 发现崩溃后&#xff0c;我们首先需要了解复现步骤&#x…

信息安全基石:深入解析CIA三元组(机密性、完整性、可用性)

1. 什么是CIA三元组&#xff1f; **CIA三元组&#xff08;CIA Triad&#xff09;**是信息安全领域的核心模型&#xff0c;定义了信息保护的三大核心目标&#xff1a; Confidentiality&#xff08;机密性&#xff09; Integrity&#xff08;完整性&#xff09; Availability&…

51单片机Proteus仿真速成教程——P1-软件与配置+Proteus绘制51单片机最小系统+新建程序模版

前言&#xff1a;本文主要围绕 51 单片机最小系统的绘制及程序模板创建展开。首先介绍了使用 Proteus 绘制 51 单片机最小系统的详细步骤&#xff0c;包括软件安装获取途径、工程创建、器件添加&#xff08;如单片机 AT89C51、晶振、电容、电阻、按键等&#xff09;、外围电路&…

逐梦DBA:MySQL目录结构与源码

一、主要目录结构 二、源码 首先&#xff0c;你要进入 MySQL下载界面。 这里你不要选择用默认的“Microsoft Windows”&#xff0c;而是要通过下拉栏&#xff0c;找到“Source Code”&#xff0c;在下面的操作系统版本里面&#xff0c; 选择 Windows&#xff08;Architecture …

【Transformer优化】Transformer的局限在哪?

自2017年Transformer横空出世以来&#xff0c;它几乎重写了自然语言处理的规则。但当我们在享受其惊人的并行计算能力和表征能力时&#xff0c;是否真正理解了它的局限性&#xff1f;本文将深入探讨在复杂度之外被忽视的五大核心缺陷&#xff0c;并试图在数学维度揭示其本质。 …

Android 源码下载以及编译指南

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、下载AOSP前的准备二、国内网络下 clone 清华大学开源软件镜像三、编写Python脚本&#xff0c;开始下载android 源码四、源码下载工具包五、编译 一…