黑马程序员——泛型

来源:互联网 发布:大数据集群测试工具 编辑:程序博客网 时间:2024/06/05 06:04
------- android培训java培训、期待与您交流! ---------

泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。表明这个集合要装的数据类型是哪种类型。

好处

1.将运行时期出现问题ClassCastException,转移到了编译时期。,方便于程序员解决问题。让运行时问题减少,安全。

2,避免了强制转换麻烦。

泛型格式:通过< >来定义要操作的引用数据类型。

在使用java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见,只要见到< >就要定义泛型。

其实< > 就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到< >中即可。泛型的类型参数只能是类类型(包括自定义类),不能是简单类型(如:int

class GenericDemo {public static void main(String[] args) {ArrayList<String> al = new ArrayList<String>();  //al.add("abc01");al.add("abc0991");al.add("abc014");//al.add(4);//al.add(new Integer(4));Iterator<String> it = al.iterator();while(it.hasNext()){String s = it.next();System.out.println(s+":"+s.length());}}}

我们也可以自己定义泛型类。什么时候定义泛型类呢?当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。例如,我们要定义一个工具类来操作其他类型的数据,但是要操作的类型并不确定,就需要定义泛型。如下:

class Utils<QQ>{private QQ q;public void setObject(QQ q){this.q = q;}public QQ getObject(){return q;}}

泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。

class Demo<T>{public  void show(T t){System.out.println("show:"+t);}public <Q> void print(Q q)  // <Q>用来声明泛型类,表明与类中的泛型不是同一个{System.out.println("print:"+q);}}

静态方法不可以访问类上定义的泛型。因为静态方法是随着类的导入而导入的,此时还没有确定泛型具体的操作类型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在静态方法上。

public  static <W> void method(W t){System.out.println("method:"+t);}
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与类型参数无关的方法,不能调用与类型参数有关的方法。

泛型的限定;

? extends E: 可以接收E类型或者E的子类型。上限。

? super E: 可以接收E类型或者E的父类型。下限

泛型不考虑继承(参数化类型不考虑类型参数的继承关系),例如,以下代码是错误的:

Vector<String > v1=new Vector<Object>( );

Vector<Object > v2=new Vector<String>( );

但是泛型是一个严格依据语法来判断的,并且只停留在变异阶段,所以以下的代码是不会报错的:

Vector  v1=new Vector<String>();

Vector<Object >  v2=v1;








原创粉丝点击