泛型:就是适用于许多许多类型
**泛型的主要目的:**就是指定当前的容器,要持有什么类型的对象,让编译器去检查,此时,就要把类型作为参数传递,需要什么类型,就传入什么类型。
定义泛型类,在类型名称后要在 <> 中说明参数列表,也可以定义多个参数
泛型类可以继承另一个类
实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个
下标的值?
思路:
class MyArray<T>{
//创建一个Object数组
private Object[] objects=new Object[10];
//设置一个存储数据的方法(T的作用就是存放指定类型的数据)
public void setArray(int pos,T val){
objects[pos]=val;
}
//设置一个获取数据的方法,(需要强转为指定类型的数据)
public T getArray(int pos){
return (T)objects[pos];
}
}
public class Test {
public static void main(String[] args) {
//传递的类型就是在我们编译的时候对数据类型进行检查
//取数据不需要进行类型转换
//<>中不能是简单类型,必须是包装类型或者引用类型
MyArray<Integer> myArray=new MyArray<>();
myArray.setArray(0,1);
myArray.setArray(1,1);
System.out.println(myArray.getArray(0));
System.out.println("=====================");
MyArray<String> myArray1=new MyArray<>();
myArray1.setArray(0,"hello");
String str=myArray1.getArray(0);
System.out.println(str);
}
}
我们可以看到,我们不仅可以传值,还可以传数据类型,不过传递的数据类型必须是包装类型或者是引用数据类型
在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。
Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。
在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
因为Alg这个泛型类实现了Comparable接口,所以传入的数据类型也要实现这个接口,因为Integer实现了Comparable接口但是Person并没有实现这个接口所以不能将Person作为类型传递,如果想传递,必须要实现Comparable接口
如图Person实现了Comparable接口所以就不会报错。