• java里程碑之泛型--使用泛型


    现在重新整理下泛型,前面的整理好多的底层的东西理解不深。泛型很重要的,作为java的一个程碑式的改进,还是很有必要认真的理解下人家的JDK的良苦用心的。
    • 1,什么是泛型?为什么要使用泛型?
    一定要记住下面的2句话:
    1),保存元素时:泛型解决了元素存储的安全性问题
    2),获取元素时:泛型解决了类型强壮的恶心编码味道
    详细点来说,java的集合有一个致命的弱点,把一个对象丢在集合里面,集合就会忘记这个对象的数据类型。当我们取出该对象的时候,这个对象的编译类型就变成了Object类型的了,注意,这个时候运行时的类型没有变的。JDK设计成这个样子是有他们的原因的,因为他们要求集合有更好的通用性,所以他们把集合设计成了可以保存任何类型的对象。当时这样子很容易出现2种恶心的地方:
    1),添加一个对象到集合中,数据不安全了。比如我想放一个A对象,结果我不小心放入了一个B对象,这样子也是可以的。
    2),从这个集合中抓这个对象出来,编译时类型由原来的类型统一变成了Object类型,如果我们使用也只能向下强壮,不仅增加了编程的复杂度,而且很容易引发ClassCastException异常。讲到这里顺便要T一下,我们要养成向下强壮时做类型检查的习惯,具体见下面的代码:
    public class Test
    {
    	public void test()
    	{
    		Object test = new Object();
    		//一旦做向下强转,就应该先做类型检查,保证代码健壮性
    		if (test instanceof Test)
    		{
    			Test test1 = (Test) test;
    		}
    	}
    }


    OK,以下是代码演示,如果不使用泛型,让我们试试我们的编码是多么恶心。
    public class Test
    {
    	public static void main(String[] args)
    	{
    		//首先这里数据不安全,我本来是要想放字符串进集合的,结果不小心放了数字了,丫的编译不会有问题的
    		List list = Lists.newArrayList();
    		list.add("1");
    		list.add(2);
    		for (Object object : list)
    		{
    			//不加入泛型,下面的代码的类型默认都是object的,所以在使用的时候,需要强转
    			String str = (String) object;
    			//java.lang.Integer incompatible with java.lang.String
    			System.out.println(str);
    		}
    	}
    }
    上面的代码编译不存在问题,但是在实际运行时会报类型转换错误,java.lang.Integer incompatible with java.lang.String。


    OK,那现在我们来使用泛型,来看下我们的编码。
    public class Test
    {
    	public static void main(String[] args)
    	{
    		List<String> list = Lists.newArrayList();
    		list.add("1");
    		//你要是这里放入list中的对象的类型不对的话,编译就不通过
    		list.add(2);
    		//在迭代循环list的时候,也不需要自己来每次强转类型了
    		for (String str : list)
    		{
    			System.out.println(str);
    		}
    	}
    }


    现在来总结下泛型的作用:
    1),类型安全。使编译器对泛型定义的类型做判断限制,如保证TreeSet里的元素类型必须一致。
    2),消除强制类型的转换,如使用Comparable比较时每次都需要类型强转。
    OK,现在关于为什么要使用泛型已经解释的很明白了,下一篇我会详细的介绍下泛型的相关基本语法。

  • 相关阅读:
    容器之队列的使用
    容器之栈的使用
    rapidxml的使用
    C++判断文件夹是否存在并创建文件夹
    VS2017,不能将const char *转为char *
    CSS_day01_选择器
    HTML_day02_列表
    HTML_day01基本标签
    python_day3
    python_day2
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5232985.html
Copyright © 2020-2023  润新知