欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java】第二十八节 泛型

程序员文章站 2024-01-04 15:28:28
...

泛型的引入

  • 泛型:可以理解为广泛通用的类型
  • 集合如果没有使用泛型如下例,会产生一些问题:集合中可以存任意类型的对象,如果将自定义类Dog和Person的实例化对象存进去,在进行比较或是类型转换问题上是不合逻辑的,在实际中人不能跟狗比较,也不能将狗转换为人;并且在程序中,传入的对象会上转型为Object,因此其自身的一些属性和方法将不能被调用
    List list = new ArrayList();
    
  • 这种情况下可以声明泛型来约束集合中只能存储哪一类对象,如下例,在该例中使用泛型规定了集合中只能存放String类型的对象
    List<String> list = new ArrayList<String>();
    

定义类的时候使用泛型

  • 在定义一个类的时候如果不能确定其中的一些属性是什么类型的,就可以将其设置为泛型,并在类名后用“”表示出来,在创建该类对象的时候要声明泛型,否则会出黄色警告,集合类的源码也是这样定义的,所以创建集合的时候要声明泛型,若没有声明,则泛型默认为Object:
    • 定义类时用泛型:
      class UnkownType<T>{
      	T x;
      	T y;
      }
      
    • 创建对象的时候声明泛型:
      UnkownType<String> ut = new UnkownType<String>();
      
  • 集合中使用泛型的好处:规定了集合中只能存放哪种引用数据类型,因此在调用该引用数据类型自身的属性和方法时不用再做强制类型转换,进而不会出现类型转换异常
  • 泛型使用的注意点:
    • 泛型前后类型需要保持一致,下面做法是错的:
      List<Integer> list = new ArrayList<String>();
      List<Object> list = new ArrayList<String>();
      
    • 从JDK1.7之后后面的类型可以不用写:
      List<String> list = new ArrayList<>();
      
    • 泛型可以用在普通方法上,例:
      class UnkownType<T>{
      	T name;
      	public T getName() {
      		return name;
      	}
      }
      
    • 泛型不能用在静态方法上,因为泛型是创建对象的时候声明的,而静态方法是加载对象是一起加载的

定义方法的时候单独使用泛型

  • 泛型方法:在方法前面添加了泛型,单独对一个方法上面定义泛型,必须有参数才有意义,因为泛型方法在使用方法时根据传入的参数确定泛型具体是哪种类型,例:
    //成员方法
    <T> void testA(T a) {
    	System.out.println(a.getClass());
    }
    <T> T testB(T a) {
    	System.out.println(a);
    	return a;
    }
    //静态方法
    <T> static void testC(T a) {
    	System.out.println(a.getClass());
    }
    <T> static T testD(T a) {
    	System.out.println(a.getClass());
    	return a;
    }
    
  • 泛型通配符:定义方法时不知道用什么类型来接收时使用通配符?表示,例:
    public class Test {
    	public static void main(String[] args) {
    		List<String> lista = new ArrayList<>();
    		test(lista);	//使用通配符,可以接收List<String>类型的参数
    		List<Integer> listb = new ArrayList<>();
    		test(listb);	//也可以接收List<Integer>的参数
    	}
    	//可以接收存储任意类型的List集合参数
    	public static void test(List<?> list) {
    		
    	}
    }
    
  • 泛型的上限:用来限定元素类型必须是指定类型或其子类,例:
    public static void test(List<? extends Number> list) {
    		
    }
    
  • 泛型的下限:用来限定元素类型必须是指定类型或其父类,例:
    public static void test(List<? super Number> list) {
    		
    }
    
  • 泛型的擦除:把声明泛型某个类型的对象的引用赋值给没有声明泛型的该类型的变量,泛型会被擦除
    List<String> listA = new ArrayList<String>();
    //此时listA只能存String类型的对象
    List listB = liatA;
    //此时listB可以存任意类型的变量
    
相关标签: Java

上一篇:

下一篇: