Java基础八(泛型)

2023-11-07

Java基础八(泛型)

目录

1.Java中的泛型是什么 ? 使用泛型的好处是什么?
2.Java的泛型是如何工作的 ? 什么是类型擦除 ?
3.什么是泛型中的限定通配符和非限定通配符 ?
4.List<? extends T>和List <? super T>之间有什么区别 ?
5.如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?
6.Java中如何使用泛型编写带有参数的类?
7.编写一段泛型程序来实现LRU缓存?
8.你可以把List传递给一个接受List参数的方法吗?
9. Array中可以用泛型吗?
10. 如何阻止Java中的类型未检查的警告?

详解

  1. Java中的泛型是什么 ? 使用泛型的好处是什么?

那些拥有Java1.4或更早版本的开发背景的人都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便泛型防止了那种情况的发生。它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException

2. Java的泛型是如何工作的 ? 什么是类型擦除 ?

泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List在运行时仅用一个List来表示。这样做的目的,是确保能和Java 5之前的版本开发二进制类库进行兼容。你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型

3. 什么是泛型中的限定通配符和非限定通配符 ?
  
  限定通配符对类型进行了限制

有两种限定通配符:

  • 一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上界;
  • 另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界;

泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误

另一方面<?>表示了非限定通配符,因为<?>可以用任意类型来替代。

4. List<? extends T>和List <? super T>之间有什么区别 ?

这两个List的声明都是限定通配符的例子,List<? extends T>可以接受任何继承自T的类型的List,而List<? super T>可以接受任何T的父类构成的List。例如List<? extends Number>可以接受List或List。

5. 如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?

编写泛型方法并不困难,你需要用泛型类型来替代原始类型,比如使用T, E or K,V等被广泛认可的类型占位符。最简单的情况下,一个泛型方法可能会像这样:

   public V put(K key, V value) {

              return cache.put(key, value);

      }
  1. Java中如何使用泛型编写带有参数的类?

面试官可能会要求你用泛型编写一个类型安全的类,而不是编写一个泛型方法。关键仍然是使用泛型类型来代替原始类型,而且要使用JDK中采用的标准占位符

7. 编写一段泛型程序来实现LRU缓存?

LinkedHashMap可以用来实现固定大小的LRU缓存,当LRU缓存已经满了的时候,它会把最老的键值对移出缓存。LinkedHashMap提供了一个称为removeEldestEntry()的方法,该方法会被put()和putAll()调用来删除最老的键值对。

8. 你可以把List传递给一个接受List参数的方法吗?

不能!!!!
 
 对任何一个不太熟悉泛型的人来说,这个Java泛型题目看起来令人疑惑,因为乍看起来String是一种Object,所以List应当可以用在需要List的地方,但是事实并非如此。真这样做的话会导致编译错误。如果你再深一步考虑,你会发现Java这样做是有意义的,因为List<Object>可以存储任何类型的对象包括String, Integer等等,而List<String>却只能用来存储Strings

       List<Object> objectList;
       List<String> stringList;
       objectList = stringList;  //compilation error incompatible types
 public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("测试1");
        list.add("测试2");
        List<Object> result = new ArrayList<Object>();
        for(int i =0;i<list.size();i++){
            result.add(list.get(i));//可以赋值
        }
        test1(list);//但是作为参数传递的话 会报错//在idea中这行已经报红了,报错了;
        test2(list);//如果这样用 就可以了
        System.out.println(result.toString());
    }
    public static String test1(List<Object> t){
        return "";
    }
    public static String test2(List<? extends Object> t){
        return "";
    }
  1. Array中可以用泛型吗?

不能!!! Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective Java一书中建议使用List来代替Array,因为List可以提供编译期的类型安全保证,而Array却不能
  
 虚拟机本身的实现就不支持泛型数组因为数组是协变,类型擦除后就没法满足数组协变的原则

协变指比如说一个int类型的数组可以插入一个double类型的数值,编译能够通过,但是运行时会出错。因为数组内建了编译期和运行时的检查;但是在使用泛型时,类型信息在编译期被擦除了,运行时也就无从检查。因此,泛型将这种错误检测移入到编译期

10. 如何阻止Java中的类型未检查的警告?

如果你把泛型和原始类型混合起来使用,例如下列代码,Java 5的javac编译器会产生类型未检查的警告,例如

   List<String> rawList = new ArrayList()

特别感谢并参考:

https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础八(泛型) 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (二、无线温湿度传感器 之 CubeMX配置)

    应用篇 在STM32L051上使用RT Thread 第二篇 使用STM32CubeMX 进行对应外设配置 同时做一些简单测试 目录 前言 一 使用 STM32CubeMX 配置 1 1 基础步骤 1 2 修改配置 1 3 踩坑记录 二 初
  • vue中element下拉框数据有值,但是选中后框里不显示

    问题图片 问题 下拉选择能打印到数据 但是选中后框里不显示值 原因 出现这个问题 是因为下拉框数据是v for接口请求来的数据 因为数据层次太多 render函数没有自动更新 解决方法 在chenge事件里手动强制刷新值 上代码
  • Linux 实用命令

    1 grep 命令 grep 命令用来查找文本 这里是最常用的几个操作例子 查找文件1 txt中含有 hello 字符串的行 grep hello 1 txt 使用正则表达式查找文件1 txt中含有数字的行 grep E d 1 txt 查
  • 内网渗透——内网信息收集

    目录 一 内网信息收集简介 1 对当前机器角色进行判断 2 对当前机器所处网络环境及拓扑结构进行判断分析 3 对当前机器所处区域进行判断 二 本机信息收集 1 手动收集 2 相关查询命令 1 获取本机网络配置信息 2 操作系统和软件信息 1
  • 修改 pip 下载插件库的下载路径

    临时使用pip 国内源 示例 pip install requests i https pypi tuna tsinghua edu cn simple 永久使用pip 国内源 示例 永久设置阿里云的国内源 pip config set g
  • 10.8.8.8柠檬wifi网页登录_简直是上网黑科技!这些神奇的网页脚本你用过吗

    PConline 应用 但凡玩过Chrome的小伙伴 大多听说过油猴脚本 除了能够带给我们更好的浏览体验外 它也可以实现很多浏览器无法实现的功能 今天小编就给大家推荐几款超级实用的油猴脚本 试过后 相信你一定会喜欢上它的 在正式开始之前 我
  • yum安装报错No URLs in mirrorlist

    在Centos 8上需要使用yum命令 但执行yum命令时报错 No URLs in mirrorlist 经查阅资料后发现 从2022年1月31日起 CentOS开发团队将会移除官方镜像源上关于CentOS 8所有的包 届时如果在Cent
  • 算法训练营第二十七天(8.10)

    目录 LeeCode332 Reconstruct Itinerary LeeCode51 N Queens LeeCode332 Reconstruct Itinerary 题目地址 力扣 题目类型 欧拉通路 深度优先 官方题解 力扣 c
  • 为近期招聘.Net开发组长编写的面试题

    1 谈谈ASP Net中GridView控件和Repeater控件有什么异同 它们之间各有什么优势 2 请编程遍历页面上所有TextBox控件并给它赋值为空字符串 3 利用正则表达式编写一个邮箱验证函数 4 谈谈对C 关键字Volatile
  • centos7离线安装nginx【亲测有效】

    离线安装Nginx所需要的所有文件都在这 点击下载 提取码 1111 若未安装 请参考CentOS7离线安装gcc和gcc c
  • int a = 1存放在哪

    int a 1 存放在哪 a作为类的成员变量存放在方法区 1保存在堆 作为局部变量这个时候a同样存在方法区的代码中 运行时a存在该方法对应的栈帧的局部变量表中 而该变量表中a的值为1 所以1存在栈内存中 astore 将一个引用类型数据保存
  • Spring AOP依赖包

    Spring4和2 5发生了很大的变化 原来的spring2 5很多倚赖的jar包都是随着spring一起发布的 现在spring4已 经不再发布倚赖包 需要你自己去导入 1 org springframework aop 4 RELEAS
  • python:迭代器类型

    Python 对于容器类型数据支持逐个进行迭代处理 迭代会对所有元素按照一个逻辑进行计算操作 因此在 Python 所有数据范围内就存在类型是否是可迭代的话题 为了高效完成迭代操作 python专门设计了迭代器类型 这类数据专门用来迭代操作
  • SQL10 用where过滤空值练习

    描述 题目 现在运营想要对用户的年龄分布开展分析 在分析时想要剔除没有获取到年龄的用户 请你取出所有年龄值不为空的用户的设备ID 性别 年龄 学校的信息 示例 user profile id device id gender age uni
  • 学习记录-使用Canal进行MySql与 PostgresSQL数据库逻辑同步

    使用Canal进行MySql与 PostgresSQL的数据同步 测试环境搭建 1 安装MySql 2 安装PostgreSQL Canal搭建 工作原理 准备工作 canal deployer安装使用 canal admin安装使用 ca
  • python绘图turtle基本练习

    1 蟒蛇 import turtle as t 引入turtle绘图库 准备窗体 宽 高 起始坐标 t setup 650 250 0 0 海龟飞行 不绘制 别名t penup t pu 后退留足够绘图空间 蛇头 t fd d 前进负数为后
  • 论文阅读: 图像分类中的注意力机制(attention)

    本文简要总结一下attention机制在图像分类任务中的应用 attention作为一种机制 有其认知神经或者生物学原理 注意力的认知神经机制是什么 如何从生物学的角度来定义注意力 在计算机视觉领域 注意力机制有各种不同形式的实现 可以大致
  • 我在某大厂做软件测试工程师的《一天完整工作流程》

    问这个问题和搜这个问题的朋友 猜想你可能是刚进入软件测试行业或准备进入测试行业的新人 是想要了解软件测试行业到底怎么样 具体工作情况如何 是否值得自己去从事 PS 这里有一套2022最新版的软件测试全套自学教程 包含了以下内容 记得一定要下
  • 文献阅读:ESAM: Discriminative Domain Adaptation with Non-Displayed Items to Improve Long-Tail Performanc

    文献阅读 ESAM Discriminative Domain Adaptation with Non Displayed Items to Improve Long Tail Performance 1 内容简介 问题描述 2 主要方法描
  • Java基础八(泛型)

    Java基础八 泛型 目录 1 Java中的泛型是什么 使用泛型的好处是什么 2 Java的泛型是如何工作的 什么是类型擦除 3 什么是泛型中的限定通配符和非限定通配符 4 List