黑马程序员-6 泛型
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
在泛型出现前,让类直接持有Object类型的对象来实现泛用。
泛型基本是现在编译器层次上。
class Point<T>{ // 此处可以随便写标识符号,T是type的简称 private T var ; // var的类型由T指定,即:由外部指定 public T getVar(){ // 返回值的类型由外部决定 return var ; } public void setVar(T var){ // 设置的类型也由外部决定 this.var = var ; } }; public class GenericsDemo06{ public static void main(String args[]){ Point<String> p = new Point<String>() ; // 里面的var类型为String类型 p.setVar("it") ; // 设置字符串 System.out.println(p.getVar().length()) ; // 取得字符串的长度 } };
泛型方法:
尽可能使用泛型方法:如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法。
static方法无法访问泛型类的类型参数,所以如果static需要使用泛型,必须使其成为泛型方法。
class Demo{ public <T> T fun(T t){ // 可以接收任意类型的数据 return t ; // 直接把参数返回 } }; public class GenericsDemo26{ public static void main(String args[]){ Demo d = new Demo() ; // 实例化Demo对象 String str = d.fun("汤姆") ; // 传递字符串 int i = d.fun(30) ; // 传递数字,自动装箱 System.out.println(str) ; // 输出内容 System.out.println(i) ; // 输出内容 } };
泛型的通配符:? 未知类型
可以对类型进行限定 ? extends E:接收E类型或者子类型对象,上限
? super E:接收E类型或者E的福类型,下限
一般来说,在存储元素的时候使用上限,因为这样都是按照上限类型来运算的,不会出现类型安全隐患。
class MyCollection<E>{ public void add(E e){ } public void addAll(MyCollection<? extends E> al){ } }
什么时候使用下限?通常对集合中的元素进行取出操作时,可以使用下限。
class TreeSet<E> { Tree(Comparator<? super E> comp); }
====================================================
泛型无法向上转型
class Info<T>{ private T var ; // 定义泛型变量 public void setVar(T var){ this.var = var ; } public T getVar(){ return this.var ; } public String toString(){ // 直接打印 return this.var.toString() ; } }; public class GenericsDemo23{ public static void main(String args[]){ Info<String> i1 = new Info<String>() ; // 泛型类型为String Info<Object> i2 = null ; i2 = i1 ; //这句会出错 incompatible types } };