首页 > 编程语言 >Java中使用通配符的限制与使用案例解析

Java中使用通配符的限制与使用案例解析

时间:2024-08-03 16:39:55浏览次数:18  
标签:Java get list ArrayList 通配符 Student 使用 类型

UML类图如下

Person类

Student类

Teacher类

Grade类

package com.itheima.demo;

import java.util.ArrayList;
import java.util.Collections;


public class Grade {
	private ArrayList<Teacher> teacherList = new ArrayList<>();
	private ArrayList<Student> studentList = new ArrayList<>();

	```

	public void sortPerson(ArrayList<? extends Person>  list) {
		if(!list.isEmpty()) {
			return;
		}

		 Person p = list.get(0);

		if(p instanceof Student) {
			for (int i = 0; i < list.size(); i++) {
				for (int j = 0; j < list.size() - i - 1; j++) {
					Student s1 = (Student) list.get(j);
					Student s2 = (Student) list.get(j + 1);
					if (s1.getScore() < s2.getScore()) {
						Student temp = s1;
						list.set(j, list.get(j + 1));
						list.set(j + 1, temp);
					}

				}
			}
		}

		if(p instanceof Teacher) {
			for (int i = 0; i < list.size(); i++) {
				for (int j = 0; j < list.size()-i-1; j++) {
					Teacher t1 = (Teacher) list.get(j);
					Teacher t2 = (Teacher) list.get(j+1);
					if(t1.getSalary()<t2.getSalary()) {
						Teacher temp = t1;
						list.set(j,list.get(j+1));
						list.set(j+1,temp);
					}

				}
			}

		}
	}
}

在Java中,通配符(Wildcard)是一种在泛型(Generics)中使用的特殊类型参数,表示可以匹配任意类型。通配符主要有两种形式:? extends T? super T。它们分别表示上界通配符和下界通配符。

上界通配符 ? extends T

使用? extends T声明的通配符表示该类型是T或T的子类型。这种通配符主要用于读取数据,不能向其中添加新的元素(除了null)。

例子:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? extends Number> list = new ArrayList<Integer>();
        
        // 不能添加元素
        // list.add(10); // 编译错误
        // list.add(10.5); // 编译错误

        // 可以读取元素
        Number num = list.get(0); // 编译通过
        
        // 可以添加 null
        list.add(null); // 编译通过
    }
}

在这个例子中,List<? extends Number>可以持有任何Number的子类类型的列表。你可以从这个列表中读取Number类型的元素,但不能向其中添加具体的元素,因为编译器无法确定列表实际持有的具体类型。

下界通配符 ? super T

使用? super T声明的通配符表示该类型是T或T的父类型。这种通配符主要用于写入数据。

例子:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? super Integer> list = new ArrayList<Number>();

        // 可以添加 Integer 及其子类的元素
        list.add(10); // 编译通过
        list.add(20); // 编译通过
        
        // 不能读取具体类型的元素(只能读取为Object)
        // Integer num = list.get(0); // 编译错误
        Object obj = list.get(0); // 编译通过
    }
}

在这个例子中,List<? super Integer>可以持有任何Integer的父类类型的列表。你可以向这个列表中添加Integer类型的元素,但从中读取时只能作为Object类型,因为编译器无法确定列表实际持有的具体类型。

结论

使用通配符声明的泛型类型在以下方面具有限制:

  • ? extends T:允许读取T或T的子类型的元素,不允许添加具体元素(除了null)。
  • ? super T:允许添加T或T的子类型的元素,但读取时只能作为Object类型。

这些限制是为了确保类型安全性,避免在运行时出现类型转换异常。

标签:Java,get,list,ArrayList,通配符,Student,使用,类型
From: https://www.cnblogs.com/itcq1024/p/18340701

相关文章

  • 【教你一招】电脑使用记录怎么查看?用什么软件
    我们时常需要回顾电脑的使用情况,无论是为了查找丢失的文件,还是确保个人电脑的安全无虞,了解电脑的使用记录都显得尤为重要。今天,就教你几招如何查看电脑使用记录,并推荐几款实用的软件工具,让你的电脑管理更加得心应手!方法一:利用Windows内置功能对于Windows用户而言,系统本身......
  • 【Java基础】02变量和数据类型
    变量一个数据存储空间的表示不同数据存入具有不同内存地址的空间,相互独立,内存地址不好记,通过变量名可以简单快速地找到数据。变量命名规则包含数字、字母、下划线、$不能以数字开头,不能是纯数字英文命名,要有意义帕斯克命名法(驼峰命名法)大骆驼:HelloWorld首字母大写,一般......
  • 尝试使用Python抓取需要先登录的网站但没有成功
    我正在尝试抓取一个需要登录的网站(我的路由器GUI),但无论我做了什么,我都会反复返回登录站点的源代码,而不是成功登录后出现的页面。我做了一些阅读,并意识到我需要返回POST请求的答案。我想我找到了它们并返回了所需的值,但仍然-似乎没有任何效果。我使用https://curl.tri......
  • 如何使用 python (使用服务帐户)在应用程序脚本 Web 应用程序上触发 doGet()?
    我想从返回json的应用程序脚本Web应用程序触发doGet(e)事件。我们的网络应用程序无法在我们的组织域之外访问,因此需要服务帐户。我执行了下面的代码,但“发生错误:401客户端错误”fromgoogle.oauth2importservice_accountfromgoogle.auth.transport.requestsimpor......
  • java 面向对象1
    1.java类一个类文件可以定义多个类,只能有一个用public修饰.java基本语法方面在有的很想c++.在学习java面向对象的时候我也得对比c++来学习.学习c++的三大特性:继承,多态,封装,是如何在java中体现的.2.封装,封装是类最基础的特装类通过将好几个成员数据封装成一个整体,便于数据成......
  • 使用 YOLOv8 进行大量错误检测
    我试图使用VisualCodeStudio运行YOLOv8。安装了ultralytics并在vscode终端上运行yolopredictmodel=yolov8n.ptsource='https://ultralytics.com/images/bus.jpg'但是我收到的输出是2persons,1bicycle,5cars,10motorcycles,73boats,3stopsi......
  • 如何使用 BeautifulSoup python 查找选择标签的选定选项值
    我正在尝试从python中的htmlselect标签获取选定的值。好吧,当选项属性设置为selected="selected"时,它是成功的,但我试图废弃的网站具有不同的选项属性,例如:-html="""<select><optionvalue="">Pleaseselectavlalue</option><o......
  • 【Java零基础视频教程】综合练习题(一)——基础练习
    文章目录基础练习飞机票打印素数生成验证码复制数组评委打分数字加密抽奖双色球基础练习飞机票机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。​按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)......
  • Java基础总结
    1,JavaJMM(java内存模型)这个内存模型搞起来还是有点弯弯绕,一点点的整理吧。JMM的目的就是保证共享变量在多线程环境下的原子性,可见性,与有序性而定义的一组规范。这些问题的出现都跟CPU的设计有关系,CPU是计算机的运算核心所有的操作或者说指令都是在CPU里面运行的,而且CPU的运行......
  • PyTorch下载完成之后无法使用GPU
    问题描述:测试代码如下:importtorchprint(torch.__version__)print(torch.cuda.is_available())print(torch.cuda.device_count())测试结果为false问题原因:使用清华源conda下载导致它会自动给你下载为cpu版问题解决:删除虚拟环境condaenvremove--namemyenv创建......