泛型
泛型的概述
广泛的类型,在定义一个类的时候,类型有些方法参数,返回值类型不确定时,就使用一个符号,表示这些尚未确定的类型,就称为泛型。
泛型的好处
提高了数据的安全性,将运行时的问题提前暴露在了编译阶段。
避免了强转的麻烦
泛型
泛型类 泛型方法 泛型接口
说明
类名后面跟着的泛型类型,是泛型的声明,一旦泛型声明出来,就相当于成为了已知类型,这个类型在整个类中都可以使用。
泛型的声明,只需要一个合法的标识符,常用字母:T E K V Q ..
泛型确定的时机:将来在使用这个类创建对象的时候。
泛型类实例一(自定义队列):
import java.util.LinkedList;
//自定义队列(使用泛型,自定异常)
public class Test01Generic {
public static void main(String[] args) throws Exception {
MyQueue<Integer> mq = new MyQueue<Integer>();
mq.in(12);
mq.in(44);
mq.in(9);
mq.out();
mq.out();
mq.out();
mq.out();
}
}
class MyQueue<E>{
private LinkedList<E> linkedList = new LinkedList<E>();
//必须声明一个链表对象,不然不知道指向哪里,因为要在堆内存中开辟空间存储元素
public void in(E e) {
linkedList.addLast(e);
}
public E out() throws Exception {
if(isEmpty()) {
throw new MyQueueEmptyException("队列空了哦亲");
}
return linkedList.removeFirst();
}
public boolean isEmpty() {
return linkedList.isEmpty();
}
}
class MyQueueEmptyException extends Exception{
public MyQueueEmptyException(String str) {
super(str);
}
}
泛型类实例二:
需求:模拟ArrayList定义MyArrayList 完成add、get和size方法
感觉这个题挺牛逼的,就是吧,一直在用ArrayList,感觉用着很棒,然后突然发现其实内部实现很简单,自己也可以写那种感觉
/*需求:模拟ArrayList定义MyArrayList 完成add、get和size方法*/
public class Test02Generic {
public static void main(String[] args) {
MyArrayList<Integer> list = new MyArrayList<Integer>();
list.add(123);
list.add(456);
list.add(789);
System.out.println(list.get(0));
System.out.println(list.size());
list.get(5);
}
}
class MyArrayList<E>{
//定义一个对象数组,存储元素
private Object[] objs;
private int size;//定义一个变量,存储数组的大小
public MyArrayList() {
//定义构造方法
//定义,在新建一个MyArrayList类时,默认开辟一个size为10的空间
objs = new Object[10];
}
public void add(E e) {
if(size >= objs.length) {
Object[] oldObjs = objs;
objs = new Object[objs.length+10];
}
objs[size] = e;
size++;
}
public int size() {
return size;
}
public E get(int index) {
if(index>=size) {
throw new RuntimeException("没那么多元素");
}
return (E)objs[index];
}
}
泛型通配符
使用泛型的时候,没有使用具体的泛型声明T,而是使用了和声明过的某个泛型T有关的一类类型,就称为泛型的通配符。三种形式:
第一种形式,