Object:是所有类的父类
泛型的特点
1、class MyStack<T> 此时的<T>代表是一个占位符 表示当前类是一个泛型类
2、 this.elem = new T[10]; 不能实例化泛型类型的数组对象
3、 MyStack<Integer> myStack = new MyStack<>();
MyStack <Integer> 这里指定当前类可以存放的数据类型
new MyStack<Integer>();//也可以
4、泛型的意义:
a:可以自动进行类型的检查(放数据的时候)
b:可以自动进行类型的转换(取数据的时候)
5、 MyStack<int> myStack = new MyStack<>();
简单类型 不能做泛型类型的参数 包装类型-》引用类型
应改为Integer
6、泛型到底是怎么编译的? 擦除机制。
擦除为Object的意义 就是可以放任意类型的数据。
运行java程序的时候 是没有泛型的概念的,也就是说,
泛型只是编译时期的一种机制,在运行时期是不存在的
7、MyStack<Integer> stack :
泛型类型的参数 不参与类型的组成
8、泛型的上界:
class Algorithm<T extends Comparable<T> > {}
T:T类型 一定要实现Comparable 接口
class Algorithm<E extends Animal> {}
E:可以是Animal的子类 或者 是Animal自己类本身
9、泛型没有下界。
10、泛型方法
public static<T> T findMaxVal(T[] array) {
public static<T extends Comparable<T>> T findMaxVal(T[] array) {
11、 通配符:通配符实际上也是一种泛型。一般用在源码
当中居多一点。
泛型一般用于读取和写入
通配符一般用于读取
上界: <? extends E >示 传入的参数? 是上界E 的子类或者E自己本身
下界:<? super E> 表示 传入的参数? 是下界E 的父类或者E自己本身
12、
ArrayList<Integer> list 、 ArrayList<Number> list2
他们直接是否构成父子类关系???
不是这样子:因为泛型不参与参数的组成
class MyStack<T> {
public T[] elem;
public int top;
public MyStack() {
this.elem = (T[])new Object[10];
//this.elem = new T[10];
}
public void push(T val) {
this.elem[top] = val;
top++;
}
public T getTop() {
return this.elem[top-1];
}
}
/**
* 写一个泛型类,找到数组当中的最大值
*/
class Algorithm<T extends Comparable<T> > {
public T findMaxVal(T[] array) {
T max = array[0];
for (int i = 1; i < array.length; i++) {
if(array[i].compareTo(max) >= 0) {
max = array[i];
}
}
return max;
}
}
class Person {
}
/**
* 泛型方法
*/
class Algorithm2 {
public static<T extends Comparable<T>> T findMaxVal(T[] array) {
T max = array[0];
for (int i = 1; i < array.length; i++) {
if(array[i].compareTo(max) >= 0) {
max = array[i];
}
}
return max;
}
}
/**
*写一个方法 打印一个list当中的所有的数据
*/
class Test {
public static<T> void print2(ArrayList<T> list) {
for (T x:list) {
System.out.println(x);
}
}
public static void print(ArrayList<?> list) {
for (Object x:list) {
System.out.println(x);
}
}
}