首页»Java WEB»泛型的意义和作用是啥?

黑龙江时时彩现场: 泛型的意义和作用是啥?

来源:hexter 发布时间:2017-06-03 阅读次数:

黑龙江时时彩玩法 www.hfebe.com.cn   简单的说,意义和作用有:

  类型的参数化,就是可以把类型像方法的参数那样传递。这一点意义非凡。

  泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。

  泛型方法,算法的复用。蛮神奇的。

  想要理解为什么引入泛型,就要知道没有泛型的麻烦。

  我们知道现在的程序开发都是面向对象了,所以程序里会有很多各种类型的对象,对象多了肯定需要有某种类型的容器来装。所以就有了一些容器类型,比如数组、ArrayList、HashMap、TreeSet等。

  对于数组,我们知道需要在使用时指定数组装的对象类型,如:

Animal animal[];

Dog dog[];

  而对于集合类型容器如ArrayList、HashMap、TreeSet等,它们不但是容器,还提供了一些方法对容器内对象的操作方法,如get,set,sort。这个时候就需要知道容器内放的是什么类型的对象,才能return或set。

  正因为程序开发人员可能把任何类型的对象放进集合容器,所以这些容器在设计的时候只能默认设计成装Object类型对象。因为Java里Object是根类。

  所以容器就成了类似这个样子:

public class ListContainer {

private Object obj;

public Object getObj() {

return obj;

}

public void setObj(Object obj) {

this.obj = obj;

}

}

  这样的话,根据多态,容器就能装任何类型的对象了。不过,取出对象时则需求进行强制类型转换,转换成实际的类型。但这样会有很多类型不安全问题,为什么呢?因为编译器没法帮忙做类型检查,导致代码在运行时易于出现ClassCastException异常。因此,类型安全问题只能由程序员自己来把关了,记住各种类型,避免类型转换错误。

ListContainer myContainer = new ListContainer();

myContainer.setObj("123");

ArrayList objectList = new ArrayList();

objectList.add(myContainer);

//下面这句编译时无异常,运行时会ClassCastException异常

Integer myStr = (Integer) ((ListContainer)objectList.get(0)).getObj();

//下面这句ok

String myStr = (String) ((ListContainer)objectList.get(0)).getObj();

  泛型出?。豪嘈偷牟问?/h3>

  利用泛型,重新设计:

public class ListContainer<T> {

private T t;

public T getObj() {

return t;

}

public void setObj(T t) {

this.t= t;

}

}

  这里<T>的T的类型的参数,具体T指代什么类型,是String还是Animal还是Dog类型此处不管,而在程序员开发时使用到ListContainer时再指定,如:

ListContainer<Dog> myCon=new ListContainer<Dog>();

  这种环境下,编译器就知道ListContainer容器是放Dog类型对象的。并进行类型安全检查。

myCon.setObj(new Dog())//ok

myCon.setObj(“123”);//编译时提醒类型错误

  这样设计的容器在使用时编译器就可以帮忙做很大一部分的类型安全检查工作了,这就避免了很多运行时的ClassCastException异常,程序员也无需记住各种对象的类型和担心类型匹配问题了。同时大部分情况下也不用做类型强制转换工作了。

ListContainer<String> myContainer = new ListContainer<String>();

myContainer.setObj("123");

myContainer.setObj(new Dog());//编译器就提醒类型异常

ArrayList objectList<ListContainer> = new ArrayList<ListContainer>();

objectList.add(myContainer);

Integer myStr = (objectList.get(0)).getObj(); //编译时提醒类型异常

String myStr = (objectList.get(0)).getObj();

  当然泛型的<>里也可以放多个参数,如:

public class MultiContainer<T,S> {

private T t;

private S s;

...

MultiContainer<String,Dog> multicon=new MultiContainer<String,Dog>();

  有界泛型

  看看这个泛型和多态的问题,Dog,Cat是Animal的子类:

public void killAll(ArrayList<Animal> animals){...};//Animal容器

...

ArrayList<Animal> animals=new ArrayList<Animal>();

animals.add(new Dog());

animals.add(new Cat());

killAll(animals);//这里ok

ArrayList<Dog> dogs=new ArrayList<Dog>();//Dog是Animal的子类

dogs.add(new Dog());

dogs.add(new Dog());

killAll(dogs);//这里编译不通过

  在这里看上去似乎多态不行了。

  这里就要用到有界泛型:

  在使用泛型时,我们会有这种需求:需要指定泛型的类型范围。有界类型就是在类型参数部分指定extends或super关键字,这里的extends也含有implements的功能,分别用上限或下限来限制类型范围,从而限制泛型的类型边界。例如:

<T extends Animal>//限定T是Animal的子类

<T super Dog >//限定T是Dog的超类

  那么上面那个多态问题就变成:

public void killAll(ArrayList<T extends Animal> animals){...};

  解决了。

<T extends Object&Comparable&Serializable>

  多个限定时我们可以使用&来进行分割,这时关键词只能使用extends。与多重继承类似,这里只有一个类其他都是接口。

  泛型方法

  有时,我们设计的方法可能其参数类型是不限定的。这种场景如果用重载方法的方式来做的话,算法重复,不是最好的方案。此时泛型方法就可以解决此类问题。

  如Calculator的add方法:

public static <N extends Number> double add(N a, N b){

double sum = 0;

sum = a.doubleValue() + b.doubleValue();

return sum;

}

  如果用重载来做的话,要很多重复代码了。

QQ群:WEB开发者官方群(515171538),验证消息:10000
微信群:加小编微信 849023636 邀请您加入,验证消息:10000
提示:更多精彩内容关注微信公众号:全栈开发者中心(fsder-com)
网友评论(共0条评论) 正在载入评论......
理智评论文明上网,拒绝恶意谩骂 发表评论 / 共0条评论
登录会员中心
  • 这个帖子,本人已经驳斥多次了。共产主义不是不能实行按劳分配,而是不需要实行按劳分配。共产主义时代,产品极大丰富,所以实行按劳分配是多余的,好比脱裤子放屁!... 2019-02-17
  • 安徽“最美罚单”被质疑执法不公 专家称合规 2019-02-17
  • 苹果高管驳斥iPhone计划报废说 iOS 12就是证据 2019-02-16
  • 江西省第33届“爱鸟周”正式启动 2019-02-16
  • 现阶段人民是指全体社会主义劳动者、社会主义事业的建设者、拥护社会主义的爱国者和拥护祖国统一的爱国者。[哈哈] 2019-02-16
  • “有个景区叫宁夏”2018景区推介及产品政策在太原发布 2019-02-15
  • 重庆私藏的绝美古镇 悠闲不打挤 2019-02-15
  • 候选企业:国家开发银行 2019-02-14
  • 湖南省益阳市牵手第十二师二二一团举办“湘疆情深 爱洒兵团”捐赠仪式 2019-02-14
  • 88rising首张合辑即将发布 当红鬼才们的盛夏狂欢亚洲 文化 2019-02-14
  • 《中国国家地理》杂志社在拉萨林周县举行“黑颈鹤观察拍摄基地”授牌仪式文章中国国家地理网 2019-02-14
  • 随着科技的发展,人们获得信息的渠道越来越多,越来越方便。刘少奇同志说过:“你们的笔,是人民的笔,你们是党和人民的耳目喉舌。”愿人民日报做好党和人民的喉舌,越办越 2019-02-13
  • 从“掌握核心科技”到“创造核心科技” “自主”是格力的秘诀 2019-02-13
  • 曼谷车展遇见门罗 电动摩托也能很有范儿 2019-02-13
  • 杭州退役女狙击手爱上摩旅 曾“单骑”出国游老挝 2019-02-13
  • 52| 431| 310| 928| 646| 373| 386| 683| 954| 239|