一、泛型
1、泛型的作用
泛型可以代表某种引用数据类型,在定义的时候如果不知道该定义什么类型,就可以定义成泛型。
泛型用<>来定义,<>里面需要写一个大写字母来代表定义一个泛型。
泛型作用:约束集合添加数据的类型。
2、类上定义泛型
类上定义泛型格式:
public class 类名<泛型类型>{
泛型类型 变量名;
}
何时确定类型:
在创建对象的时候确定具体的类型。
代码演示:
/*
如果一个类中需要一个不确定类型的变量,那么就适合使用泛型类。
使用泛型类定义的变量,可以在类中任何位置使用。
*/
public class TestClass<T> {
T t; //定义一个泛型类型的变量
public void method(){
System.out.println(t);
}
}
package com.itheima.demo03fanxing;
public class Test01 {
public static void main(String[] args) {
TestClass<String> tc = new TestClass();
tc.t = "aaa";
tc.method();
}
}
小节:定义泛型类可以使用类中的成员变量更灵活,而且在创建对象时还能约束类型。
3、方法上定义泛型
方法上定义泛型格式:
public 泛型类型 void method(T t){
}
何时确定类型:
在调用方法的时候确定具体类型。
代码演示:
/*
演示泛型方法
*/
public class TestFanxingFF {
public <T> void method(T t){
System.out.println(t);
}
}
//使用
public class Test01 {
public static void main(String[] args) {
TestFanxingFF tf = new TestFanxingFF();
tf.method("aaa");
}
}
4、接口上定义泛型
接口上定义泛型格式:
public class 接口名<T>{
}
何时确认类型:
情况一:在实现类上确定具体类型
情况二:在实现类上不确定具体类型,在创建对象时确定具体类型。
代码演示:
//接口
public interface AAA<E> {
//抽象方法
void method(E e);
}
//情况一
//实现类
public class BBB implements AAA<String> {
@Override
public void method(String s) {
}
}
//情况二
//实现类
//把接口上的泛型变成类上的泛型
public class CCC<E> implements AAA<E> {
@Override
public void method(E e) {
}
}
public class Test03 {
public static void main(String[] args) {
//创建CCC的对象,确定具体类型
CCC<String> c = new CCC<>();
c.method("abc");
}
}
5、泛型通配符
格式:
泛型通配符是在使用泛型而不是在定义泛型。
<?> : 可以匹配各种泛型类型[了解]
<? extends A> : 可以匹配A类型和A类型的子类类型 类型上限
<? super A> : 可以匹配A类型和A类型的父类类型 类型下限
示例代码:
import java.util.ArrayList;
/*
泛型通配符
<?> : 可以匹配各种泛型类型[了解]
<? extends A> : 可以匹配A类型和A类型的子类类型 类型上限
<? super A> : 可以匹配A类型和A类型的父类类型 类型下限
*/
public class TestFanxing {
public static void main(String[] args) {
ArrayList<Object> list0 = new ArrayList();
ArrayList<Animal> list1 = new ArrayList();
ArrayList<Cat> list2 = new ArrayList();
method1(list0);
method1(list1);
method1(list2);
//method2(list0); //报错
method2(list1);
method2(list2);
method3(list0);
method3(list1);
// method3(list2); //报错
}
//<?>: 可以匹配各种泛型类型[了解]
public static void method1(ArrayList<?> list){
}
//<? extends A> : 可以匹配A类型和A类型的子类类型 类型上限
public static void method2(ArrayList<? extends Animal> list){
}
//<? super A> : 可以匹配A类型和A类型的父类类型 类型下限
public static void method3(ArrayList<? super Animal> list){
}
}