黑马程序员技术交流社区

标题: 关于泛型的一点疑惑 [打印本页]

作者: 潘星    时间: 2012-8-8 06:59
标题: 关于泛型的一点疑惑
本帖最后由 潘星 于 2012-8-10 11:23 编辑

class Generic
{
        public static void main(String[] args)
        {
                Demo<String> d=new Demo<String>();
                d.show(12);//我在show方法中已经声明了参数类型为String,为什么传整数也可以?
                d.print("12");//我在print方法中声明的为Integer,则可以传入正数而不能传入字符串
        }
}
class Demo<Integer>
{
        public <String> void show(String t)
        {
                System.out.println("show"+t);
        }
        public <Integer> void print(int t)
        {
                System.out.println("print"+t);
        }
}
为什么定义了泛型为String的show方法确可以传入int类型数据,而定义泛型为
Integer正数类型的方法print确不能传字符串?
还有就是Demo类中的泛型是<Integer>,而创建Demo<String> d=new Demo<String>();
对象的时候确可以传入<String>,是什么原因呢?

作者: 程有愿    时间: 2012-8-8 08:54
这个我倒觉得是泛型的范围问题,在视频中毕老师也说过,定义在类上的泛型作用于整个类中,当方法中定义了泛型时,这时方法中的泛型将优先于类中的泛型,未被定义的泛型方法将按照类定义的泛型来操作,这里的优先不等于覆盖,所以在show中即可传入字符串也可以传入4,因为自动封装的原因4可以被提升为Integer,所以也能传入4,而你所说的print方法也就只能传入int或着Integer的参数呢了,你可以将System.out.println("show"+t);改为System.out.println("show"+t+t.getClass());,传入参数12和"12"看看就知道了,还有就是你说的那个new对象的参数能设为String这个我到感觉没什么意义,因为你的类里面已经指定了泛型了,能够这么写也不算错,只是没什么用吧了!也不知道自己的见解对不对,还望高手指点!

作者: 牛杨    时间: 2012-8-8 10:16
首先第一个问题:
d.show(12);//我在show方法中已经声明了参数类型为String,为什么传整数也可以?
因为整数可以自动转换成字符串的形式打印输出。就好比我们平时用System.out.println();打印输出一样,本来println()里面应该传人的是字符串但是我们可以 :
System.out.println(12); //打印int型的数据
System.out.println(45.34); //打印double型的数据
System.out.println('A'); //打印char型的数据
都是一个原理的

为什么定义了泛型为String的show方法确可以传入int类型数据,而定义泛型为
Integer正数类型的方法print确不能传字符串?
在show方法中你虽然定义了泛型为String,但是show方法能接收什么类型的实参数据和你的函数定义成什么样的泛型根本就没有关系。所以show方法可以传入int类型数据和show方法定义没定义泛型根本就没有关系。其次show方法能够传人int型数据是因为show方法的形参是String型的,这就又转化为了上一个你问的问题了(见上我的解答)。
而定义泛型为Integer正数类型的方法print确不能传字符串 。能不能传人字符串还是和你的函数定义不定义成泛型就没有什么关系。而是由你的print函数的形参 决定的。你的print方法不能接收字符串是因为 print方法的形参是int型的,而String类型的数据不能转换成int型的数据。所以print方法不能传人字符串。

还有就是Demo类中的泛型是<Integer>,而创建Demo<String> d=new Demo<String>();
对象的时候确可以传入<String>,是什么原因呢?
这个问题 虽然你定义泛型类的时候 写的是
class Demo<Integer>{…………} //但是你要明白这里的Integer的意义,这里的Integer只是起标识符的作用。而不再是java.lang包中的Integer封装类的。 这里的Integer就相当于我们平时定义泛型时用的 T
为了避免引起混淆 我建议楼主以后定义泛型的使用不要用java包中的类名。可以这样定义这个泛型类:
class Demo<T>
{
          …………


希望对楼主有帮助。

作者: 王峰    时间: 2012-8-8 11:53
在show方法中你虽然定义了泛型为String,但是show方法能接收什么类型的实参数据和你的函数定义成什么样的泛型根本就没有关系。所以show方法可以传入int类型数据和show方法定义没定义泛型根本就没有关系。其次show方法能够传人int型数据是因为show方法的形参是String型的,因为整数可以自动转换成字符串。
方法print之所以不能传字符串。能不能传人字符串还是和你的函数定义不定义成泛型就没有什么关系。而是由你的print函数的形参 决定的。你的print方法不能接收字符串是因为 print方法的形参是int型的,而String类型的数据不能转换成int型的数据。所以print方法不能传人字符串。
还有楼主,你的泛型定义很不正确,希望您再看看

作者: 潘星    时间: 2012-8-10 11:22
虽然有点晕,不过还是谢谢大家




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