泛型概述与好处
泛型其实就是一种未知的,不确定的数据类型。比如:ArrayList<E>,尖括号中的E就是一个泛型(未知的,不确定的数据类型),在我们使用的这个类的时候才可以确定这个E表示的类型。 泛型可以省略,如果省略,就看成泛型为Object
好处:1.省略了强转的代码;2.将运行时的问题提前到了编译时期
注意:Java中的泛型都是伪泛型,只在源代码阶段有效,一旦编译,就会消失。
泛型的定义与使用
1.1如果在定义类的时候类名后面加上<T>,那么这个类就变成了泛型类,尖括号中的字母可以是任何字母。
例如:public class 类名<T>这就是泛型类
1.2如果想要缩小泛型的使用范围,延后泛型的确认时间,可以使用泛型方法,在方法中定义的泛型,只能在方法中使用,在方法中定义的泛型所表示的数据类型,必须等到调用方法的时候才能确定。
泛型方法的定义格式:
修饰符 <泛型> 返回值类型 方法名(参数列表){
方法体;
}
例如:public T method(T t){
return t;
}
2.如果在定义接口的时候,接口名后面写上<T>,那么这个接口就是泛型接口。
例如:public interface MyInterface<T>{}
2.1等创建实现类的时候确定
例如:public class MyClass implements MyInterface<String>
2.2 等创建对象的时候才确定
例如:public class MyClass<T> implements MyInterface<T>{
public T method(T t);{
return t;
}
}
Myclass<String> mc=new MyClass();
泛型通配符
泛型之间并没有继承关系
例如:ArrayList<Object>并不是ArrayList<String>的父类
如果想要让泛型类型可以匹配任何类型,那么我们可以使用泛型通配符
?表示泛型通配符,可以匹配任何类型的泛型
注意:泛型通配符只能被动匹配,不能主动使用。
泛型的限定:可以对泛型通配符?的范围进行一个限制
例如:<? extends A> 泛型要么是A类,要么是A类的子类 上限(最高到A类)
<? super A> 泛型要么是A类,要么是A类的父类 下限(最低到A类)