黑马程序员技术交流社区

标题: 关于泛型定义在方法上,有几点不明白 [打印本页]

作者: kenfans    时间: 2015-8-6 10:19
标题: 关于泛型定义在方法上,有几点不明白
我看毕老师视频里将的,泛型可以定义在方法上,那么就按传进来的类型来操作这个方法。可是如果不用泛型,用object,不是一样会用传进来的类型操作方法吗?

比如这个代码
public class FanXin {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Demo d = new Demo();
                d.print("abc");
                d.print(123);
                d.show("abc");
                d.show(123);
        }

}

class Demo{
        public<T> void print(T t){
                System.out.println(t);
        }
        public void show(Object obj){
                System.out.println(obj);
        }
}
我用泛型和不用泛型,输出的结果都没什么区别,那这样用泛型还有什么意义呢,这是输出结果
abc
123
abc
123
感觉没什么差别啊
作者: 金逗逗    时间: 2015-8-6 10:37
你这样写没有什么区别,print方法加上泛型不用强转,show方法还得强转,不知道我理解的对不对
作者: 章浩    时间: 2015-8-6 11:05
不是这么理解的
作者: kenfans    时间: 2015-8-6 11:27
金逗逗 发表于 2015-8-6 10:37
你这样写没有什么区别,print方法加上泛型不用强转,show方法还得强转,不知道我理解的对不对 ...

我记得老师举的就是这个例子,目前例子太少,我也理解不透彻
作者: 真实姓名被注册    时间: 2015-8-6 12:32
泛型可以提高安全性
public <T> T f(T t){
       return t;
}
int s=(int)f("abc");//编译不通过

public  Object f(OObject t){
       return t;
}
int s=(int)f("abc");//编译通过,运行会抛出类型强转异常
作者: kenfans    时间: 2015-8-6 13:58
真实姓名被注册 发表于 2015-8-6 12:32
泛型可以提高安全性
public  T f(T t){
       return t;

我知道可以提高安全性。而且你这个例子。int s=(int)f("abc");和泛型没什么关系吧,把一个字符串强转成int没泛型也不会通过的。哎,我感觉你好像没明白我的意思
作者: 真实姓名被注册    时间: 2015-8-6 14:01
kenfans 发表于 2015-8-6 13:58
我知道可以提高安全性。而且你这个例子。int s=(int)f("abc");和泛型没什么关系吧,把一个字符串强转成in ...

不用泛型,用Object编译就可以通过,到运行时才会出现异常
作者: kenfans    时间: 2015-8-6 14:23
真实姓名被注册 发表于 2015-8-6 14:01
不用泛型,用Object编译就可以通过,到运行时才会出现异常

但是我的那个程序运行也不会出现异常。老是就是举的我那个例子。所以我当时就感觉在方法上用不用泛型没什么区别。

可能是我目前见的程序少了吧,还感觉不到他的实用价值
作者: xingui66    时间: 2015-8-7 10:36
1 什么是泛型
      泛型的本质就是参数化类型,参数化类型重要性在于,允许创建一些类、接口和方法,其
      所操作的数据类型被指定为参数。例如我们可以使用泛型创建一个类,在这个类中可以自动使
      用不同类型的数据。
      class GenericClass<T>{
      …
      }
2 泛型的作用
      泛型的作用表现在,在没有泛型之前,可以使用Object 来表示或者创建通用的类、接口和
     方法,但是这样作带来后果是需要作强制类型转换,而这种转换的条件是开发人员必须预知实
     际的参数类型,同时如果强制类型转换错误,编译器在编译时并不检查或提示转换错误,但是
     一旦在运行时发现错误则会产生异常,这对于一个程序来说是非常的不安全。
     而泛型的作用则恰恰体现在程序编译时就对类型进行检查,同时不必再进行强制类型转换,
     因此处理过程得到简化,代码的重用性高,并且又安全。
3 泛型相关概念
    在学习如何使用泛型之前,还必须要了解 2 个重要的概念:
    1、参数化类型
    2、类型变量
        参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表。
        类型变量:是一种非限定性标识符,用来指定类、接口或者方法的类型
作者: Acejin    时间: 2015-8-7 10:59
向上转型没问题,但是向下转型的时候可能出现问题。
作者: kingxiao    时间: 2015-8-7 12:54
当然有区别,如果定义Object的话有的地方需要强转,我看你这个和泛型没关系吧




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