Java数据结构之第十四章、泛型进阶

news/2024/11/15 5:27:13/

补充复杂示例:

public class MyArray<E extends Comparable<E>> {
...
}

表明E必须是实现了Comparable接口的

泛型基础内容

目录

一、通配符

二、通配符上界

三、通配符下界


一、通配符

? 用于在泛型的使用,即为通配符 

示例:

class Message<T> {private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}
}
public class TestDemo {public static void main(String[] args) {Message<String> message = new Message<>() ;message.setMessage("欢迎您");fun(message);}public static void fun(Message<String> temp){System.out.println(temp.getMessage());}
}

以上程序会带来新的问题,如果现在泛型的类型设置的不是String,而是Integer.

public class TestDemo {public static void main(String[] args) {Message<Integer> message = new Message();message.setMessage(99);fun(message); // 出现错误,只能接收String}public static void fun(Message<String> temp) {System.out.println(temp.getMessage());}
}

我们需要的解决方案:可以接收所有的泛型类型,但是又不能够让用户随意修改。这种情况就需要使用通配符"?"来处理
范例:使用通配符:

public class TestDemo {public static void main(String[] args) {Message<Integer> message = new Message() ;message.setMessage(55);fun(message);}// 此时使用通配符"?"描述的是它可以接收任意类型,但是由于不确定类型,所以无法修改public static void fun(Message<?> temp){
//temp.setMessage(100); 无法修改!System.out.println(temp.getMessage());}
}

在"?"的基础上又产生了两个子通配符:
? extends 类:设置通配符上限
? super 类:设置通配符下限


二、通配符上界

语法:

<? extends 上界>
<? extends Number>//可以传入的实参类型是Number或者Number的子类

class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Banana extends Fruit {
}
class Message<T> { // 设置泛型private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}
}
public class TestDemo {public static void main(String[] args) {Message<Apple> message = new Message<>() ;message.setMessage(new Apple());fun(message);Message<Banana> message2 = new Message<>() ;message2.setMessage(new Banana());fun(message2);}// 此时使用通配符"?"描述的是它可以接收任意类型,但是由于不确定类型,所以无法修改public static void fun(Message<? extends Fruit> temp){
//temp.setMessage(new Banana()); //仍然无法修改!
//temp.setMessage(new Apple()); //仍然无法修改!System.out.println(temp.getMessage());}
}

 此时无法在fun函数中对temp进行添加元素,因为temp接收的是Fruit和他的子类,此时存储的元素应该是哪个子类无法确定。所以添加会报错!但是可以获取元素。

public static void fun(Message<? extends Fruit> temp){
//temp.setMessage(new Banana()); //仍然无法修改!
//temp.setMessage(new Apple()); //仍然无法修改!Fruit b = temp.getMessage();System.out.println(b);}

通配符的上界,不能进行写入数据,只能进行读取数据。


三、通配符下界

语法:

<? super 下界>
<? super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型

class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Plate<T> {private T plate ;public T getPlate() {return plate;}public void setPlate(T plate) {this.plate = plate;}
}
public class TestDemo {public static void main(String[] args) {Plate<Fruit> plate1 = new Plate<>();plate1.setPlate(new Fruit());fun(plate1);Plate<Food> plate2 = new Plate<>();plate2.setPlate(new Food());fun(plate2);}public static void fun(Plate<? super Fruit> temp){
// 此时可以修改!!添加的是Fruit 或者Fruit的子类temp.setPlate(new Apple());//这个是Fruit的子类temp.setPlate(new Fruit());//这个是Fruit的本身
//Fruit fruit = temp.getPlate(); 不能接收,这里无法确定是哪个父类System.out.println(temp.getPlate());//只能直接输出}
}

 通配符的下界,不能进行读取数据,只能写入数据。


http://www.ppmy.cn/news/99643.html

相关文章

如何在华为OD机试中获得满分?Java实现【吃到最多的刚好合适的菜】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 入职后,导师会请你吃饭…

JavaScript 进阶 (二)

目录 深入对象 创建对象三种方式 构造函数 实例成员&静态成员 内置构造函数 Object Array String Number 深入对象 创建对象三种方式 1. 利用对象字面量创建对象 const obj { name : abc} 2. 利用 new Object 创建对象 const obj new Object({ uname: 123 }…

【五一创作】自动驾驶技术未来大有可为

本文概要 自动驾驶技术是当今汽车行业的发展热点之一&#xff0c;但其也存在着许多争议。大家也可以从以下几个维度谈谈你对这项技术的看法。 &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&#x1f31f;&#x1f31f; ☀️大家好&#xff01;我是新人小白博…

不要再来问我小学、初中毕业想出去学习编程找到工作的问题了,你要做就去做,结果自己扛着就行了!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

源码角度分析多线程并发情况下数据异常回滚方案

一、 多线程并发情况下数据异常回滚解决方案 在需要多个没有前后顺序的数据操作情况下&#xff0c;一般我们可以选择使用并发的形式去操作&#xff0c;以提高处理的速度&#xff0c;但并发情况下&#xff0c;我们使用 Transactional 还能解决事务回滚问题吗。 例如有下面表结…

ChatGPT使用总结:150个ChatGPT提示词模板(完整版)

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 所有提示词模板功能列表如下&#xff1a; &#x1f4bb; 充当 Linux 终端 i want you to act as a linux terminal. I will typ…

C语言之数组指针2.0

在 C 语言中&#xff0c;数组指针是一种特殊的指针类型&#xff0c;它是一个指向数组的指针。其声明形式为&#xff1a; <数据类型> (*<指针变量名>)[<数组长度>];例如&#xff0c;下面声明了一个指向整型数组的指针变量 arrPtr&#xff1a; int (*arrPtr)…

使用gcc进行编译的简单实例

文章目录 使用gcc进行编译的简单实例单一程序&#xff1a;打印 Hello World主、子程序链接&#xff1a;子程序的编译调用外部函数库&#xff1a;加入链接的函数库gcc的简易用法(编译、参数与连接) 使用gcc进行编译的简单实例 单一程序&#xff1a;打印 Hello World 我第一个程…