Android面试题详解之泛型是什么,泛型擦除呢?

重学Android基础系列篇(二):泛型 本系列文章主要是汇总了一下大佬们的技术文章,属于Android基础部分,作为一名合格的安卓开发工程师,咱们肯定要熟练掌握java和android,本期就来说说这些~ 阅读详情

泛型是什么,泛型擦除呢?

详细讲解

享学课堂移动互联网系统课程:架构师筑基必备技能《架构设计中必不可少的泛型-Java泛型的定义与原理》

这道题想考察什么?

泛型

考察的知识点

泛型的特点和优缺点以及泛型擦除

考生应该如何回答

泛型就是一种就是一种不确定的数据类型。在Java中有着重要的地位,在面向对象编程及各种设计模式中都有非常广泛的应用。

泛型的优点

我们为什么需要使用泛型:

  1. 适用于多种数据类型执行相同的代码,例如两个数据相加:
public int addInt(int x,int y){
    return x+y;
}

public float addFloat(float x,float y){
    return x+y;
}

不同的类型,我们就需要增加不同的方法,但是使用泛型那我们的代表将变为:

public <T> T addInt(T x,T y){
    return x+y;
}
  1. 编译检查,例如下面代码
List<String> list = new ArrayList();
list.add(10);//①
list.add("享学");
String name = list.get(2);//②

因为我们指定了List泛型类型为String,因此在代码1处编译时会报错。而在代码2处,不再需要做类型强转。

泛型的缺点
  1. 静态域或者方法里不能引用泛型变量,因为泛型是在new对象的时候才知道,而类的构造方法是在静态变量之后执行。
  2. 不能捕获泛型类对象
泛型擦除

Jdk中实现的泛型实际上是伪泛型,例如泛型类 Fruit<T> ,编译时 T 会被擦除,成为 Object。但是泛型擦除会带来一个复杂的问题:

桥方法

有如下代码:

public class Parent<T> {
    
    public void setSrc(T src){
       
    }
}
public class Child extends Parent<String>{
    @Override
    public void setSrc(String src) {
        super.setSrc(src);
    }
}

Parent类是一个泛型类,在经过编译时泛型擦除后其中setSrc(T) 将会变为setSrc(Object);而Child类继承与Parent并且指定了泛型类型为String。那么经过编译后这两个类应该变为:

public class Parent {
    
    public void setSrc(Object src){
       
    }
}
public class Child extends Parent{
    @Override
    public void setSrc(String src) {
        super.setSrc(src);
    }
}

父类存在setSrc(Object),而子类则是setSrc(String)。这明显是两个不同的方法,按照Java的重写规则,子类并没有重写父类的方法,而是重载。

所以实际上子类中存在两个setSrc方法。一个自己的,一个是继承自父类的:

public void setSrc(String src)
public void setSrc(Object src)

那么当我们:

Parent o = new Child();
o.setSrc("1");

此时o实际类型是Child,静态类型是Parent。按照Java规则,会调用父类中的setSrc(Object),如:

public class A{
    public void setValue(Object value){
		System.out.println("Object");
	}
}
public class B extends A{
        public void setValue(String value){
            System.out.println("String");
        }
}

public static void main(String[] args) {
	A a = new  B();
	a.setValue("1");
	a.setValue(11);
}

上诉代码会输出两次”Object“。然而在泛型中却不符合此规则,因为 Java 编译器帮我们处理了这种情况,在泛型中引入了"Bridge Method"—桥方法。通过查看Child.class的字节码文件 :

public void setSrc(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: invokespecial #2                  // Method Parent.setSrc:(Ljava/lang/Object;)V
         5: return
      LineNumberTable:
        line 4: 0
        line 6: 5

public void setSrc(java.lang.Object);
    descriptor: (Ljava/lang/Object;)V
    flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0
         1: aload_1
         2: checkcast     #3                  // class java/lang/String
         5: invokevirtual #4                  // Method setSrc:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 1: 0
}

可以看到 Child 类中有两个 setSrc方法,一个参数为 String 类型,一个参数为 Object 类型,参数为 Object 类型。而参数为Object的setSrc方法可以在flags中看到ACC_BRIDGE和ACC_SYNTHETIC 。其中ACC_BRIDGE用于说明这个方法是由编译生成的桥接方法,ACC_SYNTHETIC说明这个方法是由编译器生成,并且不会在源代码中出现。

在setSrc(Object)桥方法可以看到实际上会使用checkcast先进行类型转换检查,然后执行invokevirtual调用setSrc(String)方法,这样就避免了我们还能调用到父类的方法。

更多面试题详解可以扫描二维码免费领取!

【Android面试八股文】你能说说什么是泛型以及泛型擦除吗? 泛型(Generics)是Java SE 5中引入的一个新特性,可以使Java中的类和方法具有更广泛的类型范围。通俗的说,它使得我们可以在定义类和方法时指定一个或多个类型参数,从而可以在不考虑具体类型的情况下,代码中直接使用这些类型参数。泛型可以增强代码的安全性、可读性和可重用性。例如,可以使用泛型实现容器类(如ArrayList、HashMap)等。在使用泛型时,需要在编写代码时指定泛型类型,这样可以在编译期间检查代码的类型安全性。JDK中实现的泛型实际上是伪泛型,例如泛型类Fruit<T>,编译时。 阅读详情

相关推荐

Java 泛型擦除后的三种补救方法

Java中的泛型,在运行时刻其具体类型是被擦除的,这样我们就不能用new T(),instanceof等关操作,特别是对泛型类型的类的实例化问题,在此根据《Thinking in Java》中所讲的对类型擦除所带来问题的三种解决方案,比较了其各自的优缺点。

Android学习总结之Java篇(一)

泛型擦除,锁的底层原理,锁的分类,CAS缺点和解决问题

2301_80329517的博客 1062

android擦除效果代码(橡皮擦)

android擦除效果代码(橡皮擦功能)

Android 开发也要掌握的Java知识 - Java 泛型擦除

文章目录1.什么是泛型擦除2.编译期如何擦除泛型:3.泛型擦除也会有副作用4.这里放黑马教程的截图,可以在哔哩哔哩上免费观看5.验证泛型擦除6.验证泛型桥接7.参考文章 1.什么是泛型擦除 因为Java 泛型是1.5版本才引入的,为了向下兼容,其实虚拟机是不支持泛型的,Java里面是伪泛型机制 Java在编译期就擦除了所有泛型信息,这样Java就不需要产生新的类型到字节码,所有泛型类型最终都是一种类型 2.编译期如何擦除泛型: 1.检查泛型类型,获取目标类型 2.擦除类型变量,替换为限定类型 2.1如果

Good包籽的Android专栏 282

解密微信视频号推荐算法的三大核心机制

本文深入解析微信视频号推荐算法的三大核心机制:用户行为数据、视频内容质量和社交关系链。通过详细的数据分析和实战测试,揭示算法如何根据完播率、互动深度、原创性检测和社交关系等因素决定内容推荐。帮助用户和创作者更好地理解并利用视频号算法,提升内容曝光和观看体验。

weixin_42573113的博客 1788

基于Kubernetes的ML平台架构设计

本文在Kubernetes开源组件的基础上,对ML平台各部分组件的作用进行了介绍,并且进行了组件选型,初步设计了ML平台的技术架构。

2401_83124266的博客 2052

泛型擦除,泛型边界 ? extends E (规定上边界,拿进去) ? super E(规定下边界,拿出来)

泛型边界 ? extends E (规定上边界,拿进去) ? super E(规定下边界,拿出来)

klz 480

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2374

【Android】【Java】泛型的擦除

1.泛型的基础概念 泛型实现了参数化类型的概念,使代码可以应用于多种类型。 简单泛型 public class Hold< public class Hold<T> { private T a; public Hold(T a){ this.a = a; } public T getA() { return a; } public void setA(T ...

左耳的专栏 689

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现

本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。

weixin_33724046的博客 437

睿思综述智能体:100篇高质量文献一键生成万字长文,还能联网PubMed,科研效率拉满!

对一个主题进行文献综述,是日常科研人绕不过去的工作,无论是写论文前言,综述论文,或者基金申请书的立项依据,需要根据主题,从海量文献中提取相关信息,梳理出清晰的逻辑线,再组织成流畅的文字。4 一键生成万字全文:大纲确认后,它会基于对所有论文的深度理解,逐个章节进行详细撰写,最终生成一篇逻辑连贯、内容翔实、引用规范的万字综述长文,并直接保存为Word(.docx)文件。3 智能撰写大纲:你可以提供自己的大纲,也可以让它根据所有文献内容,智能生成一个逻辑清晰的综述大纲,并支持你在此基础上修改。

dinaxuejie的博客 821

Android面试题之Java 泛型和Kotlin泛型

如果只需要从集合中获得类型T,使用

AntDream的程序世界 1712

Java泛型的内部原理:类型擦除并举例说明,android音视频面试题

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021最新面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。一个人可以走的很快,但一群人才能走的更远。

2401_84166896的博客 861

STM32F103/F407/H743不同GPIO速度配置(HAL库)对应的最高速度

详细介绍了STM32F103/F407/H743不同GPIO速度配置(HAL库)对应的最高速度。

kevin1499的博客 5592

VS中的C#项目怎样引入另一个项目

场景 在C#项目A中需要引用项目B。 实现 将项目B手动复制到A所在的项目目录下的同一个解决方案中,即与项目A同级的目录下。 在VS中打开项目B,打开解决方案资源管理器--右击解决方案--添加--现有项目 然后找到项目B的.csproj文件打开。 然后看到资源管理器中已经将B添加进来了 点击项目A的引用-右键-添加 将项目下的解决方...

BADAO_LIUMANG_QIZHI的博客 9322

Java reflect 反射机制与泛型擦除,31道Android面试题

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!在这里我也分享一份自己收录整理的**Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料**帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

m0_60721823的博客 682

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android开发面试——Java泛型机制7连问

大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程就是泛型擦除。举个例子:如上返回true,说明泛型类型String和Integer都被擦除掉了,只剩下原始类型Java的泛型也可以被称作是伪泛型真泛型:泛型中的类型是真实存在的。

2401_89872708的博客 1005

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

泛型常见面试题

泛型常见面试题 泛型常见面试题 1. Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中。那些拥有Java1.4或更早版本的开发背景的人 都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供...

weixin_44433649的博客 1044

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

面试官:什么是泛型擦除、泛型上界、泛型下界、PECS原则?

泛型的本质是 类型参数化,解决类型爆炸的问题。所谓泛型是指将类型参数化,以达到代码复用提高软件开发工作效率的一种数据类型。比如:如果我们的代码中存在很多的 食物类型, 继承关系如下然后我们要定义一个盘子 plate,注意这个盘子除了 装入食物food之外,还可以装其他的比如 小玩具。(1) 装水果的盘子 FruitPlate(2) 装肉的盘子 MeatPlate(3) 装苹果的盘子 ApplePlate(4) 装香蕉的盘子 BananaPlate.....

竹林幽深 237

2024年安卓最全面试官问我:“泛型擦除是什么,会带来什么问题?”(1),2024年最新dubbo经典面试题

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的。

2301_82243733的博客 1089

Kotlin学习手记--泛型、泛型约束、泛型型变、星投影、泛型擦除、内联特化,作为移动开发程序员应该怎样去规划自己的学习路线

外链图片转存中…(img-62WiPquH-1712778454747)]

2401_84149505的博客 934

Kotlin学习手记--泛型、泛型约束、泛型型变、星投影、泛型擦除、内联特化

总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

2301_82241819的博客 572

01、泛型是什么?,Android经典面试题详解

} public void setData(T data) { this.mData = data; } } 3. 泛型方法 // public后面的是泛型方法的关键 public Generics getGenerics() { return new Generics(); } 2.2 泛型边界 以上几种类型均可定义泛型的边界,语法 、<T extends A&B&…>,泛型重载了extends的关键字,与通常JAVA中使用的extends不同。 < T extend

m0_66144992的博客 255
上一篇: Android面试题详解之为什么Intent传递对象为什么需要序列化?(阿里)
下一篇: Android面试题详解之List\<String\>能否转为List\<Object\>
网络安全-XG
博客等级 码龄5年 1万+粉丝 2752原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值