记得前段时时间有个面试体,大致意思就是让我说明为什么泛型不能使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<T> { Object[] obj = new Object[10]; public T add (T t) { obj[0] = t; return (T)obj[0]; } public static void main(String[] args) { Main<Integer> mai = new Main(); //除了这里需要声明为Integer,其它都工作正常 int i = mai.add(1); System.out.println(i); } }
============================================================
|| 我是小布,小布又作小步的意思,哪怕小步前行,也希望自己一直坚持下去!||
============================================================