0

0

说说java的泛型机制是怎样的

王林

王林

发布时间:2021-01-27 09:59:06

|

2421人浏览过

|

来源于掘金

转载

说说java的泛型机制是怎样的

面试官:说一下java的泛型机制是怎样的。

(学习视频分享:java视频教程

精简版回答

Java在开发时,通过使用菱形语法,使一个类、接口或者方法具有接受泛指的一群类作为参数,泛指的类最终由尖括号里的规则所限定,泛指类通常用大写字母表示,一般用字母T,后期经过Java编译器编译,泛型将被擦除,根据具体使用的类,替换泛型,生成class字节码,所以泛型是对Jvm透明的。

立即学习Java免费学习笔记(深入)”;

豪华版回答

泛型于JDK1.5正式引入

Java引入泛型背景

Java集合是允许放入多种类型的,例如

    List list=new ArrayList();
    list.add("String");
    list.add(1024);

这在JDK1.5之前是常见的使用方式,即便放在今天的JDK下,也是允许的,那么类似于这种集合的使用方式,就会带来一些问题,就是集合中究竟放了哪些类型,恐怕只有创建集合的人才知道,其他调用者,根本无法确定,这样在大型项目里,极易出现问题,调用者强转集合里的某个对象,一旦类型错误,就会报错,这种错在当时编译阶段是无法发现的,只有运行时才被发现,为了解决类似问题,JDK引入了泛型。

泛型类型

引入泛型后,从而可以在编译阶段,检查类型是否符合要求,很大程度上,杜绝了盲目的类型转换。 泛型主要工作在编译器,编译后,JVM运行时,是无法感知泛型的。 泛型分为普通泛型和通配泛型。

1.普通泛型

绿色大气茶叶网站源码下载1.0
绿色大气茶叶网站源码下载1.0

PHPWEB绿色大气茶叶网站源码下载,源码为PHPWEB 2.05 的商业版。本来是为某人制作的网站,在制作之前,问及什么要求。说是没要求,然后按照某某网站来做即可。(即这套程序的1.X的版本)。我再三确认是否有别的要求。都说没有,然后在发给他看的时候又说不满意,完全和那边的站点一样。哎哟我的妈,当初要求就这样,我不按照这个来做怎么做?现在免费发布出来给大家吧!

下载

这类泛型顾名思义,就是支持调用时传入任意类型,但是调用时,等号左右俩边泛型必须一致。JDK1.7右侧菱形可以省略。

class Test{...} //声明时
Test test = new Test(); //调用时
Test test = new Test(); //1.7调用时

3.界限泛型

//无界泛型,任意类型都匹配
//有界泛型 - 继承自某父类
//有界泛型 - 实现某接口
//有界泛型 - 多重边界
//有界泛型 - 指定类父类

泛型擦除

刚才说到,泛型只在写代码时和编译时起作用,而Jvm加载class运行时是无感透明的,是因为编译器编译时将泛型擦除了,简单不严谨的说就是:把类或方法上的那个尖括号干掉了,根据尖括号里的规则换成具体的类,所以Jvm运行时根本不知道这段代码里之前有过泛型,这样做是为了兼容,前面说到泛型是JDK1.5才引入的,这样,即便引入泛型,现有的Jvm也不需要大改,只需要改一下编译器即可,对于这种编译器能感知的语法,而虚拟机无法感知的,人们把这种语法称作语法糖(suger),编译器经过 脱糖(Desuger) 后,拿到干货,交给虚拟机去执行。

(图文教程推荐:java入门教程

泛型擦除机制

//Pair的泛型
public class Pair {

    private T mFirst;
    private T mSecond;

    public T getmFirst() {
        return mFirst;
    }

    public void setmFirst(T mFirst) {
        this.mFirst = mFirst;
    }

    public T getmSecond() {
        return mSecond;
    }

    public void setmSecond(T mSecond) {
        this.mSecond = mSecond;
    }
}

//Pair的原始类型
//无论何时定义一个泛型类型,都会自动提供一个相应的 原始类型
public class Pair {

    private Object mFirst;
    private Object mSecond;

    public Object getFirst() {
        return mFirst;
    }

    public void setFirst(Object mFirst) {
        this.mFirst = mFirst;
    }

    public Object getSecond() {
        return mSecond;
    }

    public void setmSecond(Object mSecond) {
        this.mSecond = mSecond;
    }
}

//如果调用Pair编译擦除后得到如下=
class Pair{
    private String mFirst;
    private String mSecond;
    ...
}

当泛型作为方法的入参时,擦除后换成通配泛型的下界,例如add方法

public static void insertElements(List list){
    //Add进来的都是层级“小于等于”A的,也就是下界
    list.add(new A());
    list.add(new B());
    list.add(new C());
}

当泛型作为方法的回参时,擦除后换成通配泛型的上界,例如get方法

public void processElements(List elements){
   //for循环挨个get list 里的数据,都当做A,也就是都当做上界
   for(A a : elements){
      System.out.println(a.getValue());
   }
}

对于泛型的类型擦除说再多,看再多博客,不如官方定义准确,放一段Oracle官方对于类型擦除的文档

Type Erasure
Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:
Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.Insert type casts if necessary to preserve type safety.Generate bridge methods to preserve polymorphism in extended generic types.Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.

更多面试题请点击:java面试题及答案

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

8

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

13

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

6

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

5

2026.01.15

php图片上传教程汇总
php图片上传教程汇总

本专题整合了php图片上传相关教程,阅读专题下面的文章了解更多详细教程。

2

2026.01.15

phpstorm相关教程大全
phpstorm相关教程大全

本专题整合了phpstorm相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.6万人学习

C# 教程
C# 教程

共94课时 | 6.8万人学习

Java 教程
Java 教程

共578课时 | 46.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号