- 泛型的引入,是为了能够写一个类/方法能够同时支持多种不同类型的对象。所谓泛型就是从语法层面上对Object进行一个简单的包装,编译过程帮我们自动加上一些编译期的类型检查,自动帮我们完成类型转换工作。
-
public class seqList<E>
E是一个泛型参数(相当于一个形参,需要在真正对该类进行实例化的时候确定实参),泛型参数有:E,T,KEY等。E这样的泛型参数不能直接被实例化,因为当前还不确定E是什么类型。所以应该
private E[] data = (E[]) new object[100];
3.泛型这样的语法是一种编译期的机制,为了方便写代码,以及在编译过程中进行一些类型检查操作,编译完成后,在运行中时没有泛型的。编译中直接把泛型参数当成了object,只不过编译器自动加了一些类型转换操作,以及类型校验操作。
4.如果是int,double,如何套用到泛型中?
这两个不是继承自object,与object无关。
应该先创建好一个类,用这个类来表示一个整数,标准库已经帮我们建好了---8种包装类(除了Integer和Character,其他首字母大写)
5. 装箱和拆箱--类型转换
自动装箱和自动拆箱--隐式类型转换
6.
package fanXing;
/**
* @program: 1011
* @description
* @author: YouName
* @create: 2021-10-11 17:23
**/
public class SeqList<E> {
//当前这个data的类型是啥,可以当成一个Object[].Object具体代表的是那种类型
//需要最终在实例化SeqList的时候才能确定下来。
//E这样的泛型参数是不能被直接实例化的,因为当前还不知道E到底是啥类型。
private E[] data = (E[])new Object[100];
private int size;
public void add(E elem) {
data[size] = elem;
size++;
}
public E get(int index) {
return data[index];
}
public static void main(String[] args) {
/* SeqList<String> seqList = new SeqList<>();
//String也是继承自object
//调用add相当于向上转型
seqList.add("aaa");
seqList.add("bbb");
//调用get的时候返回的是object,这里需要向下转型
String str = seqList.get(0);
System.out.println(str);
SeqList<Animal> animal = new SeqList<>();
animal.add(new Animal());*/
SeqList<Integer> integerSeqList = new SeqList<>();
//这个操作相当于把int转换成Interger---装箱boxing
//Integer num = new Integer(10);//方法一:通过构造方法来装箱
//Integer num = Integer.valueOf(10);//方法二:静态方法装箱
Integer num = 10;//方法二的简化:把int直接赋值给Integer。自动装箱(编译器赋予包装类的特殊功能)
integerSeqList.add(num);
//把Interger转化成int---拆箱unboxing
num = integerSeqList.get(0);
//int value = num.intValue();//手动拆箱
int value = num;//自动拆箱
}
}