您的位置:首页 > 职场人生

黑马程序员——泛型、泛型限定

2014-03-08 03:11 197 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

一、为什么要有泛型

泛型其实就是用来限制传入的数据类型的,他可以在类中、方法中限定传入数据的类型。在没有泛型之前,常用Object obj来表示操作中的数据类型不确定,但是使用中必然需要强转为需要的数据类型,比较麻烦。(重点是泛型限定)

二、泛型的作用

1、泛型将运行时期的问题ClassCastException转移到了编译时期,使得我们可以在编译时期就能够对程序进行调整、规范,同时也避免了强转的麻烦

2、泛型限制了传入数据类型,于是就有了泛型限定的概念。利用泛型限定,抽取出对象的共有方法,既可以限制其他数据类型的传入,又能够优化代码,完成功能。

三、泛型的基本类型

①泛型类

class A<Q>
{
private Q obj;
public  void setObject(Q obj)
{
this.obj = obj;
}
public Q getObject()
{
return obj;
}
}
②泛型方法

public <W> void print(W w)
{
System.out.println("print:"+w);
}


③泛型静态函数

public static <Q> void function(Q t)
{
System.out.println("function:"+t);
}
④泛型接口

interface Inter<T>
{
void show(T t);
}
class InterImpl<R> implements Inter<R>
{
public void show(R r)
{
System.out.println("show:"+r);
}
}


四、泛型实用的注意事项

1、泛型到底代表什么类型取决于调用者传入的类型,也就是说:如果调用者是一个子类类型,且它的泛型限定是<? super E>,那么它就可以调用它和它的父类类型的泛型限定函数。如果没传,默认是Object类型。

2、使用带泛型的类创建对象时,等式两边的泛型必须相同。因为运行的时候需要对象的具体类型。

3、如果等式两边一边有泛型,一边没有,可以兼容。但是分两种情况:

泛型在左边:编译时检查增加的元素是否与变量类型相符,否则编译失败

import java.util.*;
class  Test
{
public static void main(String[] args)
{

ArrayList<Integer>  al=new ArrayList();
al.add(1);
al.add(2);
al.add("asd");
System.out.println(al);//编译失败
}
}


泛型在右边:相当于泛型不存在

import java.util.*;
class  Test
{
public static void main(String[] args)
{
ArrayList al=new ArrayList<Integer>();
al.add(1);
al.add(2);
al.add("asd");
System.out.println(al);//打印结果为[1, 2, asd]
}
}
五、泛型限定的使用

在使用泛型限定中,可以很好的对我们的代码进行优化。使用时,首先我们的代码必须有共性的部分,被我们抽取成泛型。如果我们调用的对象是一个子类,这时我们要考虑子类的方法,如果它的方法参数中有<? super E>我们就可以考虑,调用抽取出去的父类泛型限定的共性。同理,如果我们拥有animal的集合,它拥有子集两只脚的、四只脚的、更多脚的。。。。当我们想向animal集合中添加元素时,这个集合的类型就是animal,而添加的元素属于它的子集,那么添加元素的方法必须是这样的<?
extends animal>。

----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐