泛型类
class MyArray<T>{ }
代表当前类是一个泛型类,尖括号“<>”中是泛型所要指定的类型,类型形参一般用一个大写字母表示
类名后的<T>代表占位符,表示当前类是一个泛型类,占位符通常为:
(1)E表示Element
(2)K表示 Key
(3)V表示 Value
(4)N表示Number
(5)T表示Type
(6)s, u,V等等-第二、第三、第四个类型
泛型占位符
class MyArray<T>{
//定义一个T类型的数据
public T[] array =(T[]) new Object[10];
public T getPos(int pos){
return array[pos];
}
public void setObj(int pos,int val){
this.array[pos] = val;
}
}
MyArray<Integer> myArray = new MyArray<Integer>();
实例化一个对象myArray,对象的接收类型只能是Integer类型
myArray.setObj(0,10);
myArray.setObj(1,5);
myArray.setObj(0,10.0);
此时红色部分就会报错,因为接收类型为Integer,编译时会进行检查。
实例化对象的同时指定当前泛型类的指定参数类型是Integer,当设置其他数据类型时会报错

只能存储指定类型数据,不然报错,且指定类型可以有多个
泛型作用
1.存储数据的时候可以帮我们进行自动的类型检查
2.获取元素的时候,可以帮我们进行类型转换
泛型是编译时期的一种机制,在运行时没有泛型的概念,编译完成之后泛型类型被擦除为Object类
泛型的上界
public class Alg <E extends Number>{ }
--只接受Number及其子类类型,指定E类型的上界是Number类型
public class Alg2 <E extends Comparable<E>>{ }
--E必须是实现了Comparable接口的
EG:
class Test<E> {
public E findMax(E[] array) {
E max = array[0];
for (int i = 1; i < array.length; i++) {
if (max < array[i]) {
for循环中if语句报错,E为引用类型不能直接用大于小于直接比较,基本数据类型可以使用
E类型为泛型实际都是object类,没有实现Comparable接口,也不能用compareTo来进行比较
max = array[i];
}
}
return max;
}
}
class Test1<E extends Comparable<E>> {
E将来指定的类型必须是实现了Comparable接口,因此在下面可以使用CompareTo比较
//class Test1<E extends Number>
上述表示E只能是Number的子类或Number类型本身,代表泛型的上界为Number类
public E findMax(E[] array) {
E max = array[0];
for (int i = 1; i < array.length; i++) {
if (max.compareTo(array[i]) < 0) {
max = array[i];
}
}
return max;
}
}
泛型方法
class Alg{
此处泛型方法中E为,实现了Comparable接口的类型
public <E extends Comparable<E>> E findMax2(E[] array){
E max = array[0];
for (int i = 1; i < array.length; i++) {
if(max.compareTo(array[i]) < 0){
max = array[i];
}
}
return max;
}
}
public class UpperBound{
泛型方法为E类型,但是此处报红,原因是此时E类型是谁?根本不知道,没有意义
public E findMax(E[] array){
E max = array[0];
for (int i = 1; i < array.length; i++) {
if(max.compareTo(array[i]) < 0){
max = array[i];
}
}
return max;
}
public static void main(String[] args) {
Alg alg= new Alg();
Integer[] array = {4,5,3,5,6};
Integer val = alg.<Integer>findMax2(array);
此处alg.后面的<Integer>可以省略
}
}