A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭冰川 中级黑马   /  2013-2-6 21:15  /  2389 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 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);
        }
}

6 个回复

倒序浏览
public <T> void print(T t){
            System.out.println(t);
    }
刚好今天也复习到这一块儿。其实这个T表示你可以放各种类型的对象,不仅限于int和String类型。这就是泛型方法的强大之处。在不确定要传入参数的类型的情形下,可以用T来表示。在传入实参时,就根据需要传入合适的类型。
回复 使用道具 举报
        public void show(Object obj){
                System.out.println(obj);//因为Object是所有类的父类,所以这个调用Object的toString方法再输出到控制台,
        }
        public <T> void print(T t){//这里用泛型,就是你传什么类型进去,就调用什么类型的toString方法
                System.out.println(t);
        }
回复 使用道具 举报
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);

        }
}

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 很给力!解释的很透彻,支持了。.

查看全部评分

回复 使用道具 举报
陈科宇 发表于 2013-2-6 22:07
public class GenerricDemo {

        public static void main(String[] args) {

哦了,看来区别主要体现在Object接收不了基本数据类型这
回复 使用道具 举报
郭冰川 发表于 2013-2-6 22:40
哦了,看来区别主要体现在Object接收不了基本数据类型这

朋友你的理解还是有错误的哦。两者都是不能接受基本类型的数据的。你看到可以直接放入123进去,不是表示,它能放基本数据类型,而是JDK1.5之后支持自动包装和拆装。你放的是123,java内部把它却视为Integer对象。区别在于Collection<Object>指定了泛型类型为Object,而Collection<T>没有指定。你好好看看我给你的解释,就会明白了。
回复 使用道具 举报
你这是没有返回值类型的,如果你定义的函数有返回值类型,而且类型跟你定义的泛型一样时呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马