JAVA泛型只能用引用类型_泛型为什么只能是引用类型?

本文解析了Java泛型不能直接用于基本类型的原因,包括泛型作为语法糖的实现机制、基础类型与Object的关系、泛型擦除后的类型限制,以及为何后期编译器允许基础类型使用。通过实例演示了基础类型在泛型中的处理方式。
摘要由CSDN通过智能技术生成

记得前段时时间有个面试体,大致意思就是让我说明为什么泛型不能使primitive type,也就是java的基础类型,自己这道题答的并不是太好。

自己思考的是,基础类型会有默认值,当我们想要表达空值时,我们并不能准确的表达我们的意思,因为基础类型有默认值,所以Java设计者不允许泛型为基础类型。  划重点:这是错误的理解

泛型是java提供的语法糖,它是通过编译器的提供的希望提高开发效率的新语法。没有泛型之前,对于通用的方法中的引用类型数据的输入和输出都只能采取数据转换的方式。泛型语法糖的思路就是:通过编译器保证泛型类型的一致性,并帮助我们强制转换(编译器帮我们加了强制转换,反编译是可以看到的)。

泛型为什么是引用类型:

1.java中所有引用类型都继承自Object并且基础数据类型的包装类型也继承自Object,这就给了编译器设计者一种考虑,把T是作为Object而存在,输出时,通过强制转换转换为实际类型。

2.选择将T作为Ojbect而存在还有一种原因就是Java的兼容性问题,由于Java5之前数组都是以Object声明的,由于数组类型没法强制转换,如果选用Object作为泛型擦除后的类型,就可以避免对集合类库较大的改动,同时也保持了兼容性。但这样也使得java中的泛型不是真正的泛型,而是作为语法糖而存在的。

为什么不能是基础数据类型:

1.上面已经说明了泛型擦除后是作为Object而存在的,而基础数据类型并没有继承自Object,所以编译器不允许将基础类型声明为泛型类型。最近版本的编译器当涉及基础类型作为泛型参数时,编译器会自动进行拆箱和装箱,所以编译器不会报错。          其实有了自动转换功能后,编译器允许基础类型也没什么影响,语法原因而已。

public class Main{

Object[] obj= new Object[10];publicT add (T t) {

obj[0] =t;return (T)obj[0];

}public static voidmain(String[] args) {

Main mai = new Main(); //除了这里需要声明为Integer,其它都工作正常

int i = mai.add(1);

System.out.println(i);

}

}

============================================================

|| 我是小布,小布又作小步的意思,哪怕小步前行,也希望自己一直坚持下去!||

============================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值