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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王鹏伟 中级黑马   /  2013-2-25 17:33  /  1689 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

private static  void printColl(ArrayList<?> al){
}

定义泛型方法时为什么不在返回值前面加上<?>,而
private static <T> void printColl(ArrayList<T> al){
}
明确T类型时要加上<T>?
接收集合上已经定义了泛型,返回值类型前面为什么还要定义<T>?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 鼓励一下

查看全部评分

5 个回复

倒序浏览
你应该定义 “?”
回复 使用道具 举报
这是一个类型形参的声明
个人认为:
就像在java中要使用变量需要先声明变量
同理,在方法的的参数列表或者方法体内要使用类型形参,也得先声明!
回复 使用道具 举报
让泛型作为返回值,有什么意义呢,看看下面的例子吧:

        public T GetActivatedServer<T>(NetIdentity netIdentity, string name)
        {
            string url = netIdentity.GetRemoteBaseUrl() + name;
            object service = Activator.GetObject(typeof(T), url);
            return (T)service;
        }


这是remoting中的一个例子,完成的功能是返回一个远程对象的实例。如果没有泛型,我们需要为每个远程对象实例的创建都建立一个方法,而有了泛型之后,可以很方便解决这个问题。(本句欠妥,应该指出“没有泛型的时候我们也可以传个Type进去再在外面强制类型转换”,所以,本句说的“解决这个问题”中的这个问题,不应是指编码更少,更美观,而更应该是但“使用泛型是高效并类型安全的”)


---------------------------------------------------------------------------------------------------------------
而你明确类型时候要加<T>你也说了是明确类型,它主要目的还是让你能够写出有类型安全性的集合,也就是例如说,让编译器能够帮助你防止把一群cat加到一群Dog中
回复 使用道具 举报

1,定义泛型方法时为什么不在返回值前面加上<?>,
我想这是语法规定的问题,没为什么
2,明确T类型时要加上<T>?
先定义再使用,没有定义的东西当然不能用
3,接收集合上已经定义了泛型,返回值类型前面为什么还要定义<T>?
你是说ArrayList<T> 这里定义了泛型了?
ArrayList<T> 只是使用了已定义的泛型,

方法的泛型定义:类型必须定义在返回类型之前,且紧靠返回类型.
回复 使用道具 举报
第一:泛型方法没有在返回值前面加上<?>,那么这个就不是泛型方法。这个方法中的参数中的泛型,是类指定的泛型。
比如PersonArray类,
class PersonArray<T>{
    private T t;
    public void setObject(T t){
       this.t = t;
    }
}
其中的setObject方法中的T指定是PersonArray中的T。也就是说SetObject方法中传递的参数类型必须与PersonArray中泛型的类型一致。

第二:泛型方法的定义。
你提到“接收集合上已经定义了泛型,返回值类型前面为什么还要定义<T>?”
这是因为泛型类定义的泛型在整个类中有效,为了让不同方法可以操作不同类型,而且类型不确定,所以将泛型定义在方法上。

class Demo<T>{
    private T t;
    public void setObject(T t){
       this.t = t;
    }
    public <T> void show(T t){
       System.out.println(t);
    }
}


setObject方法中接受的参数类型必须与Demo指定的类型是一致的,而show方法接受的参数类型与Demo指定的类型可以相同也可以不同。

第三:静态方法的泛型
静态方法不可以访问类上定义的泛型,如果静态方法要操作的应用数据类型不确定,可以将泛型定义在方法上。
你这里的“private static <T> void printColl(ArrayList<T> al)”printColl方法是静态的,如果返回值类型前面不定义<T>?,就是访问了类上定义的泛型,就会编译失败。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马