一、简介
泛型其实也是一种类型,通俗的讲就是任意类型
其关键字为<>,泛型广泛应用于集合,如之前的项目中写到的ArrayList<>就涉及到了泛型
在定义类或者接口的时候,不知道使用者需要哪种类型,就需要使用泛型
泛型可以定义类 接口 变量 方法等
二、泛型实例
1.泛型类
class Test<E>{
//在定义的时候可以使用泛型来代表任意的类型
//但是在使用的时候(定义变量,创建对象)必须传递实际对象
E var1;//类里面有一个泛型变量,具体它是什么类型,使用的时候来决定
}
public class MyClass {
public static void main(String[] args){
Test<String> test;//定义泛型变量
new Test<String>();//创建对象
Test<String>test1 = new Test<>();//同时定义对象和声明具体的类型只需要在前面指定类型
test1.var1 = "jack";//此时var1就是String类型
System.out.println(test1.getClass());//打印结果为String
}
}
2.泛型接口
interface Itest<E>{
void test(E e);//定义一个方法,方法的参数为泛型
}
//要使用接口就必须要实现接口里面的方法
//有两种方法实现
//1.单独创建一个类来实现其方法,使用的时候创建这个类的对象即可。创建类也有两种方法
//(1)指定接口的类型
class Mytest1 implements Itest<String>{
public void test(String s){
}
}
//(2)指定当前类为泛型
class Mytest2 <E> implements Itest<E>{
public void test(E e){
}
}
public class MyClass {
public static void main(String[] args){
Itest<String> Itest1 = new Mytest1();
Itest<String> Itest2 = new Mytest2<>();
}
}
//使用匿名内部类实现
//public class MyClass {
// public static void main(String[] args){
// 第二种用法,创建一个匿名内部类来实现接口
// Itest<String> Itest3 = new Itest<String>() {
// @Override
// public void test(String s) {
// }
// };
// }
// }
3.泛型方法
//如果本身就是泛型类,不用使用泛型方法
//必须在方法前使用<E>来表示需要使用泛型
class Father{
public <E> void test(E e){
System.out.println(e);
}
}
public class MyClass {
public static void main(String[] args){
Father father = new Father();
father.test("jack");
}
}
三、“?”通配符
在使用泛型时都还不确定到底需要什么类型,就可以使用?来表示任意类型
class Universal{
public void showList(List<?> list){
//该集合接受任意类型
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
public class MyClass {
public static void main(String[] args){
Universal universal = new Universal();
List<String> name = new ArrayList<>();
name.add("jack");
name.add("Tom");
universal.showList(name);
//注意一点
List<?>names = new ArrayList<String>();//这种定义方式会出错
}
}