泛型
(1)概述
是一种把类型明确的工作推迟到创建对象
或者调用方法的时候才去明确的特殊的类型。
参数化类型,把类型当作参数一样的传递。
(2)格式
<数据类型> 这里的数据类型只能是引用数据类型
JDK1.7之前 泛型前面后面都得写上,JDK1.7可以省略右半边不写
(3)好处
1.把运行时期的问题提前到了编译期间
-
避免了强制类型转换
3.优化了程序设计,解决了黄色警告线
注意:泛型只在编译期有效 但在运行期就擦除了4.泛型可以限定,我这个集合中存储什么样的引用数据类型
(4)举例
public class Demo1 {
public static void main(String[] args) {
ArrayList list2 = new ArrayList();
list2.add("aaaaa");
list2.add("bbbb");
list2.add("ccc");
list2.add("ddd");
Object obj = list2.get(0);
String string= (String) obj;
int i=string.length();
System.out.println(i);
//泛型可以避免向下转型
ArrayList<String> list3= new ArrayList();
list3.add("aaaaa");
list3.add("bbbb");
list3.add("ccc");
list3.add("ddd");
String s = list3.get(0);
System.out.println(s);
}
}
结果:
aaaaa
aaaaa
(5)泛型方法
泛型方法概述: 把泛型定义在方法上
定义格式: public <泛型类型> 返回类型 方法名(泛型类型 变量名)
public class MyTest2 {
public static void main(String[] args) {
MyClass<String> stringMyClass = new MyClass<>();
stringMyClass.setT("abc");
String t = stringMyClass.getT();
MyClass<Integer> integerMyClass = new MyClass<>();
integerMyClass.setT(100);
Integer t1 = integerMyClass.getT();
}
class MyClass<T> { //泛型<T> 我把泛型加在类上
T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
}
(6)泛型接口
泛型接口概述: 把泛型定义在接口上
定义格式: public interface 接口名<泛型类型>
public class MyTest3 {
public static void main(String[] args) {
//接口上的泛型,在你创建该接口的子类对象时,必须要明确这个泛型,具体是什么数据类型
MyDemo2<Integer, String, String> integerStringStringMyDemo2 = new MyDemo2<>();
Collection<Integer> collection=new ArrayList<Integer>();
//匿名内部类 在创建接口的子类对象时,就必须明确接口上的泛型,到底是什么类型
new MyInterface<String,String,String>(){
@Override
public String show(String s, String s2) {
return null;
}
};
}
interface MyInterface<T,U,R> { //泛型接口
public R show(T t,U u);
}
class MyDemo2<T, U, R> implements MyInterface<T, U, R>{
@Override
public R show(T t, U u) {
return null;
}
}
}