泛型 : 就是适用于许多许多类型,从代码上讲,就是对类型实现了参数化.
class MyArrayl <E> {
public Object[] objects = new Object[3];
public E getPos (int pos) {
return (E) objects[pos];
}
public void setobjects (int pos, E val) {
objects[pos] = val;
}
}
类名后的<T>代表占位符,表示当前类是一个泛型类.
一些字母的含义 (这些不是规定):
E 表示 Element(元素)
K 表示 Key
V 表示 value
N 表示 Number
T 表示 Type (类型)
现在我们去实例化一个对象.
public class Test1 {
public static void main(String[] args) {
MyArrayl<Integer> b = new MyArrayl<>();
}
}
注意 :
不可以传入基本类型 :
泛型的优点 :
1.存储数据的时候 可以帮我们进行自动的类型检查
2.获取元素的时候 可以帮我们进行类型转换
规定 : 在泛型中 不能去实例化 一个泛型类型的数组
在定义泛型的时候 : 我们可以在 <>中写多个参数
问题 : Java到底怎么编译的呢 ?
擦除机制 : 在编译的过程当中,将所有的T替换成Object这种机制,我们称为 : 擦除机制
Java在运行的时候,没有泛型的概念,在编译完成之后,泛型类型 会被全部擦除为Object.
题目 : 运用泛型类中的方法去返回最大值.
大家想一想这个为什么是错的呢 ?
因为引用类型之间不能通过大小写比较,在前面的章节中提到过 : 我们要通过调用compareTo().
不能调用compareTo()方法是因为 : 当前的泛型类没有实现Comparable接口.
那么就证明不管之后传过来的是什么引用类型,它必须是实现Comparable接口的.那代码就要改成这样 :
泛型方法 :
只需要在方法的返回值类型前面加上一个参数列表就好了.
class Alg {
public <E extends Comparable<E>> E findMax (E[] array) {
E max = array[0];
for (int i = 0; i < array.length; i++) {
if (max.compareTo(array[i]) < 0) {
max = array[i];
}
}
return max;
}
}
我们去调用一下这个泛型方法 :
public class Test2 {
public static void main(String[] args) {
Alg alg = new Alg();
Integer[] integer = new Integer[]{1,2,3,234,6};
int max = alg.<Integer>findMax(integer);
System.out.println(max);
}
}
这一行代码中的<Integer>可以省略 :
int max = alg.findMax(integer);
代码可以在精简一点 :
我们把泛型方法定义成静态的,这样我们可以直接通过类名就可以去调用它.不用再去new对象了.
class Alg {
public static <E extends Comparable<E>> E findMax (E[] array) {
E max = array[0];
for (int i = 0; i < array.length; i++) {
if (max.compareTo(array[i]) < 0) {
max = array[i];
}
}
return max;
}
}
public class Test2 {
public static void main(String[] args) {
Integer[] integer = new Integer[]{1,2,3,234,6};
int max = Alg.findMax(integer);
System.out.println(max);
}
}
运行结果 :
希望可以帮到大家~~~~~~有不懂的地方可以私信我.