黑马程序员技术交流社区

标题: 在函数内定义泛型和参数改成Object到底有多大区别? [打印本页]

作者: as604049322    时间: 2014-12-1 10:55
标题: 在函数内定义泛型和参数改成Object到底有多大区别?
我感觉就一个区别,前者不需要强转,后者需要强转。不知道各位还有什么高见。

作者: FlyFish    时间: 2014-12-1 11:06
泛型好处:1.不必强转
2.解决安全问题
作者: DamonZh    时间: 2014-12-1 18:47
感觉最重要的还是解决了安全问题吧。
作者: Cfan_yang    时间: 2014-12-1 18:54
不使用泛型. 会使容器装的类型不一致,会导致程序不安全.
作者: 大大的心    时间: 2014-12-1 22:01
先了解什么是泛型,你就懂了!!!!!!!!!!!!!


泛型:JDK1.5以后出现的新特性,用于解决安全问题,是一个类型安全机制。

          int[] arr = new int[3];
          arr[0] = 1;
          //arr[1] = 3.5;//编译失败,因为数组在创建时就已经明确了类型。
          而容器在创建时没有明确类型,容易有安全隐患。这时可以使用泛型来明确容器的类型。
         
好处:
     1.将运行时期出现问题ClassCastException,转移到了编译时期。
          方便于程序猿解决问题,让运行时期问题减少,安全。
     2.避免了强制转换的麻烦。

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

在使用java提供的对象时,什么时候使用泛型呢?
             通常在集合框架中很常见,只要见到<>就要定义泛型。

其实<>就是用来接收类型的。
     当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。



泛型定义在类上:

什么时候定义泛型类?
     当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。
     现在定义泛型来完成扩展。

泛型定义在方法上:

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

class Demo<T>
{
     public void show(T t)
     {
          System.out.println("show "+t);
     }
     public void print(T t)
     {
          System.out.println("print "+t);
     }
}

为了不让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。

特殊之处:
     静态方法不可以访问类上定义的泛型。
     如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

class Demo <Q>
{
     public <T> void show(T t)//泛型定义在方法上,可以操作不同类型
     {
          System.out.println("show "+t);
     }
   
     public void print(Q t)//泛型类定义的泛型在整个类中有效
     {
          System.out.println("print "+t);
     }
   
     public static <W> void method(W t)
     {
          System.out.println("method "+t);
     }
}

泛型定义在接口上。

     通配符       ?     也可以理解为占位符。     
   
   泛型限定:   
   <? extends E>:可以接收E类型和E的子类型。上限。
   <? super E>:可以接收E类型或者E的父类型。下限。
  
       只打印Person和Person的子类  用  <? extends Person>

作者: 大大的心    时间: 2014-12-1 22:02
哥们你在黑马了吧,送我点黑马币呗,如果可以的话。嘿嘿。我要来黑马啊。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2