java泛型场景补充注意事项

前言

本文不是对泛型的系统介绍,也不打算对其进行入门讲解,只是对遇到的一些泛型场景的补充。看过宋红康和韩顺平的javase课程可以花几分钟看看。

1.&符号在泛型中的使用,用来描述有边界的受约束泛型

class A{}
interface B{}
public class C< T extends A & B>{}

这里的泛型类型受到约束,既要是A的子类,也要实现B的接口。注意虽然B是接口但是泛型仍要用关键字extends,并且写在A的右边。

2.泛型方法中的泛型参数在方法被调用时确定。常见形参位置带有泛型,然后根据传入实参确定,不再详叙。还有一种少见的情况是根据引用类型来确定的,需要注意。

public class Testing {
//public <T> T generic(){String s1 = "generic";return (T)s1;}@Testpublic void test2(){ReflectionTest r1 = new ReflectionTest();String s1 = r1.generic();Sort s2 = r1.generic();}
}

这里强转成什么类型是由String s1或Sort s2决定的,此时才决定泛型类型。
返回值本身是String类,所以第一次调用不报错,第二次调用报错。

3.泛型通配符的读写情况

首先声明,在以下用到list的代码中,将get方法称为读,将add方法称为写。

 @Testpublic void wildcard(){List<?> list = null;List<String> list1 = new ArrayList<>();list1.add("A");list = list1;
//        readObject o = list.get(0);System.out.println("o = " + o);//        writelist.add("B");//此处报错list.add(null);//添加null不报错}

对于读的情况不难理解。
对于写的情况。将通配符可以看作是一个范围,或者一个可列集合(特指数学概念,不是java中的接口)。List< Integer >显然在List<?>集合中。

List<Integer> list2 = new ArrayList<>();
list = list2;

是允许的,但这样list.add(“B”);就会报错。
add方法中只能传递 集合List<?>中的全体元素调用后不报错的参数。但此集合元素是无限的,显然无法做到。

下面来看有上边界通配符的情况

class Father{}
// interface B{}
class Son1 extends Father{}
class Son2 extends Father{}
  @Testpublic void upperBounded(){List<? extends Father> list = null;List<Father> list1 = new ArrayList<>();list1.add(new Father());list = list1;//        read 没问题Father father = list.get(0);
//        write 除了null,剩下的报错list.add(null);list.add(new Father());list.add(new Son1());}

这里可能对 list.add(new Father());list.add(new Son1());报错产生困惑。还是如上所述,<? extends Father>只是范围,或者说一个有限的可列集合(此处单指数学概念,并非java接口),它包含了所有< Son1>< Son2>……只要是Father子类的泛型情况。List< Son2 >显然在List<? extends Father>集合中。
List< Son 2> list1 = new ArrayList<>();list = list1;是允许的,但这样 list.add(new Father());list.add(new Son1());就会报错。
add方法中只能传递 集合<? extends Father>中的全体元素调用后不报错的参数。

下面来看下边界通配符的情况

 @Testpublic void lowerBounded(){List<? super Father> list;List<Father> list1 = new ArrayList<>();list1.add(new Father());list = list1;
//        readObject object = list.get(0);//        writelist.add(new Father());list.add(new Son1());list.add(new Son2());}

对于确定下边界的统配符来说,读写总是没问题的。读的情况不难理解。
对于写的情况,根据上述的规则:add方法中只能传递 集合<? super Father>中的全体元素调用后不报错的参数,因为此处的全体元素都是Father的父类,写入自然没有问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一题55:跳跃游戏

题目描述&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …

2021年06月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 下列程序运行的结果是&#xff1f; s hello print(sworld)A: sworld B: helloworld C: hello D: world 答案&#xff1a…

Java练习题-输出斐波那契(Fibonacci)数列

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

被邀请为期刊审稿时,如何做一个合格的审稿人?官方版本教程来喽

审稿是学术研究中非常重要的环节&#xff0c;它可以确保研究的科学性和严谨性。审稿人的任务是检查文章是否符合学术规范&#xff0c;是否具有创新性&#xff0c;是否具有科学价值&#xff0c;以及是否符合期刊的定位和风格。因此&#xff0c;审稿人需要具有扎实的学术背景和丰…

ThingsBoard的版本控制整合gitee

1、注册gitee账号,创建自己的空间,并且创建一个用于存储ThingsBoard相关的仓库 2、进入ThingsBoard的租户层,然后找到版本控制,进行配置 输入gitee的仓库地址 仓库URL:指定你的gitee的参考地址 仓库分支:master 身份验证:密码、访问令牌 用户名:登录账号 密码/访问令…

Kotlin中的异常处理

异常是在程序执行过程中出现的错误或意外情况&#xff0c;可以干扰程序的正常流程。在Kotlin中&#xff0c;我们可以通过异常处理机制来捕获和处理异常&#xff0c;以保证程序的稳定性。本篇博客将介绍异常的产生、捕获、定义、受检异常和finally关键字&#xff0c;并提供相应的…

深入探究Selenium定位技巧及最佳实践

在使用Selenium进行Web自动化测试时&#xff0c;准确地定位元素是非常重要的一步。Selenium提供了多种元素定位方法&#xff0c;本文将深入探究这八大元素定位方法&#xff0c;帮助读者更好地理解和应用Selenium的定位技巧。 1. ID定位 ID是元素在HTML中的唯一标识符&#xff…

Spring中事务失效的几种场景及解决办法

未抛出异常&#xff1a;如果在一个带有事务的方法中没有抛出异常&#xff0c;Spring无法检测到事务失败&#xff0c;从而无法回滚。解决方法是确保在事务中遇到错误时抛出异常。 异常被捕获&#xff1a;如果在一个带有事务的方法中抛出异常&#xff0c;但被捕获并处理了&#…

造车先做三蹦子220101--机器学习字符(字母、和数字识别)的“小白鼠”与“果蝇”

“0”数字字符零 的图片(16*16点阵)&#xff1a; #Letter23Digital23R231006d.pyimport torch import torch.nn as nn import torch.optim as optim #optimizer optim.SGD(model.parameters(), lr0.01) from PIL import Image from PIL import ImageDraw from PIL import Im…

Spring Boot OAuth 2.0整合—高级配置

一、概述 HttpSecurity.oauth2Login() 为定制OAuth 2.0登录提供了大量的配置选项。主要的配置选项被分组到它们的协议端点对应处。 例如&#xff0c;oauth2Login().authorizationEndpoint() 允许配置授权端点&#xff0c;而 oauth2Login().tokenEndpoint() 允许配置令牌端点。…

asp.net企业招聘管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 企业招聘管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net企业招聘管理系统 二、功…

rabbitmq-3.8.15集群、集群镜像模式安装部署

目录 一、环境 1、映射、域名、三墙 2、Erlang和socat安装&#xff08;三台服务器都实行&#xff09; 二、部署三台rabbitmq-3.8.15实例 1、rabbitmq官网下载地址 &#xff1a; 2、解压rabbitmq 3、添加系统变量 4、启动web插件、启动rabbitmq 5、在rabbitmq1上添加用…

在keil中debug分析单片机数据和函数调用过程(c51为例),使用寄存器组导致错误原因分析

寄存器参考 参考2 [寄存器组使用using参考]&#xff08;https://blog.csdn.net/weixin_46720928/article/details/110221835&#xff09; keil中的using关键字参考 官方文档里关于using的说明可参阅2个地方&#xff0c;&#xff08;1&#xff09;keil软件菜单栏->Help->…

2023年中国汽车覆盖件模具竞争格局、市场规模及行业需求前景[图]

汽车覆盖件模具是汽车车身生产的重要工艺装备&#xff0c;其设计和制造时间约占汽车开发周期的 2/3&#xff0c;是汽车换型的重要制约因素之一。汽车覆盖件模具具有尺寸大、工作型面复杂、技术标准高等特点&#xff0c;属于技术密集型产品。汽车覆盖件模具按以其冲压的汽车覆盖…

【tg】6: MediaManager的主要功能

【tg】2:视频采集的输入和输出 的管理者是 media manager‘ media 需要 network的支持:NetworkInterface friend class MediaManager::NetworkInterfaceImpl;NetworkInterfaceImpl 直接持有 MediaManager 的指针即可:发送rtp包、rtcp包、设置socket选项?

NodeMCU ESP8266 读取按键外部输入信号详解(图文并茂)

NodeMCU ESP8266 读取按键外部输入信号教程&#xff08;图文并茂&#xff09; 文章目录 NodeMCU ESP8266 读取按键外部输入信号教程&#xff08;图文并茂&#xff09;前言按键输入常用接口pinModedigitalRead 示例代码结论 前言 ESP8266如何检测外部信号的输入&#xff0c;通常…

JVM——一些零散的概念(后续学习深入了再补充)

Native 凡是带了native关键字的&#xff0c;说明Java的作用范围的达不到了&#xff0c;需要调用底层C语言的库 调用native方法&#xff0c;会进入本地方法栈&#xff0c;调用本地接口(JNI) JNI的作用&#xff1a;扩展Java的使用&#xff0c;融合不同的编程语言为Java所用 它在内…

适合在虚拟化环境中部署 Kubernetes 的三个场景

在《虚拟化 vs. 裸金属&#xff1a;K8s 部署环境架构与特性对比》文章中&#xff0c;我们从架构和特性的角度&#xff0c;对比了在虚拟化和裸金属环境部署 Kubernetes 的优劣势&#xff0c;并在文末列举了两者更适合的应用场景。本文&#xff0c;我们将聚焦以虚拟化环境支持 K8…

【LeetCode刷题】1两数之和

为找工作&#xff0c;我的代码都是用的JAVA&#xff0c;慢慢学习中。 LeetCode刷题Day1 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入…

《动手学深度学习 Pytorch版》 10.2 注意力汇聚:Nadaraya-Watson 核回归

import torch from torch import nn from d2l import torch as d2l1964 年提出的 Nadaraya-Watson 核回归模型是一个简单但完整的例子&#xff0c;可以用于演示具有注意力机制的机器学习。 10.2.1 生成数据集 根据下面的非线性函数生成一个人工数据集&#xff0c;其中噪声项 …