黑马程序员技术交流社区

标题: 关于泛型定义在方法上 [打印本页]

作者: 郭冰川    时间: 2013-2-6 21:15
标题: 关于泛型定义在方法上
本帖最后由 张向辉 于 2013-2-7 20:03 编辑

show()的参数列表因为是Object所以可以是任何对象,  print()在方法上设置了泛型,也可以是任何对象,
例如代码中,打印 int , String都没问题 , 没弄懂他俩的区别,或者说在什么情况下会有区别.

public class GenerricDemo {

        public static void main(String[] args) {
                Demo1 d = new Demo1();
               
                d.show(123);
                d.show("abc");
                                
                d.print("abc");
                d.print(123);
        }
}
class Demo1{
        public void show(Object obj){
                System.out.println(obj);
        }
        public <T> void print(T t){
                System.out.println(t);
        }
}


作者: 陈科宇    时间: 2013-2-6 21:58
public <T> void print(T t){
            System.out.println(t);
    }
刚好今天也复习到这一块儿。其实这个T表示你可以放各种类型的对象,不仅限于int和String类型。这就是泛型方法的强大之处。在不确定要传入参数的类型的情形下,可以用T来表示。在传入实参时,就根据需要传入合适的类型。
作者: 铿锵科技    时间: 2013-2-6 22:03
        public void show(Object obj){
                System.out.println(obj);//因为Object是所有类的父类,所以这个调用Object的toString方法再输出到控制台,
        }
        public <T> void print(T t){//这里用泛型,就是你传什么类型进去,就调用什么类型的toString方法
                System.out.println(t);
        }
作者: 陈科宇    时间: 2013-2-6 22:07
public class GenerricDemo {

        public static void main(String[] args) {
                Demo1 d = new Demo1();

                d.show(123);
                d.show("abc");
                d.print("abc");
                d.print(123);
                Collection<String> t=new ArrayList<String>();
                d.showCollection(t);//编译不能通过
                d.printCollection(t);//编译可以通过
                /*
                 * 这才能看出两者的差别。如果你的形参集合类型是Collection<Object>,
                 * 那么是不能传入实参Collection<String>的,这两者并没有任何的继承关系。
                 * 而此时T的做用就很明显了。它可以让你在传入实参时才指定泛型的类型,能够真正做到
                 * 存放各种类型的对象。你要树立一个概念,泛型要用于操作集合,才能发挥它的功效
                 *
                 */
        }
}

class Demo1 {
        public void show(Object obj) {
                System.out.println(obj);
        }

        public void showCollection(Collection<Object> t) {
                System.out.println(t);

        }

        public <T> void print(T t) {
                System.out.println(t);
        }

        public <T> void printCollection(Collection<T> t) {
                System.out.println(t);

        }
}

作者: 郭冰川    时间: 2013-2-6 22:40
陈科宇 发表于 2013-2-6 22:07
public class GenerricDemo {

        public static void main(String[] args) {

哦了,看来区别主要体现在Object接收不了基本数据类型这
作者: 陈科宇    时间: 2013-2-6 22:48
郭冰川 发表于 2013-2-6 22:40
哦了,看来区别主要体现在Object接收不了基本数据类型这

朋友你的理解还是有错误的哦。两者都是不能接受基本类型的数据的。你看到可以直接放入123进去,不是表示,它能放基本数据类型,而是JDK1.5之后支持自动包装和拆装。你放的是123,java内部把它却视为Integer对象。区别在于Collection<Object>指定了泛型类型为Object,而Collection<T>没有指定。你好好看看我给你的解释,就会明白了。
作者: 朱玉玺    时间: 2013-2-7 19:37
你这是没有返回值类型的,如果你定义的函数有返回值类型,而且类型跟你定义的泛型一样时呢?




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