java泛型
泛型是参数化的类型,作用主要是可以进行编译时检查和避免类型转换。
如谓参数化类型,如:List<T>,这个“T”就可以代表任何引用类型,如:Integer,Boolean....
如谓编译时检查:如List<Integer> list,如何往list中Add一个字符串,那么编译器就会报错。
如谓类型转换:如Integer i=list.get(x)时,这个list.get(x)直接返回Integer,不用在手动进行类型转换。
有了泛型后,官方推荐使用泛型编程。
除了List<T>这个早期就知道是哪个类型的场景外,在有的时候,List中的类型早期是不知道的,这种情况我就可以使用通配符”?”代替,表明这是一个未知类型,
如:List<?> list, 这样申明后,list可以传入从任何的引用类型,但这也带来了一定的局限,由于?代表任何类型,换句话说,JVM不知道?是什么类型,因此,这个带?的泛型只能进行类型无关的操作,如读取list的大小等。
除了通配符“?”,泛型也提供了对泛型类型的限定符,如 extends 代表泛型的上限,supper代表泛型的下限,这两个用来约束泛型类型的范围。
如上这些,都是编译期的语法糖,在java代表被编译后,泛型类型会被擦除掉,对JVM来说,最终类型都是一样的,如List<Integer>与List<Boolean>的类的相同的,事实上,List里的数据类型都是Object,但对于存在上限限定的场景,如List<? extends String>,则list中的数据类型为String,即上限限定的类型。