黑马程序员技术交流社区

标题: 泛型中2条语句的区别? [打印本页]

作者: 淡淡柠檬茶    时间: 2014-6-5 09:29
标题: 泛型中2条语句的区别?
本帖最后由 淡淡柠檬茶 于 2014-6-5 13:02 编辑

public static void printC0ll(ArrayList<?> al)
{
        Iterator<?> it = d.iterator();
}

public static <T>void printC0ll(ArrayList<T> al)
{
        Iterator<T> it = d.iterator();
}
作者: 李小然    时间: 2014-6-5 12:15
你给的两个方法在JVM看来是一样的

T指的是泛型的固定类型
?是一个通配符,不extends的话,就代表Object下面所有子类

他们仅在很小的地方有差异

例如
class ObjectGen<T extends Object> {
        private T x;
        public ObjectGen(T x) {
         this.x = x;
        }
}  

public class TestGeneric
{
        public static void main(String[] args)
        {
                String st = "";
               
                //可编译
                ObjectGen<String> obj1 = new ObjectGen<String>(st);  
                //不可编译
                ObjectGen<T extends Object> obj2 = new ObjectGen<String>(st);
                //可编译
                ObjectGen<? extends Object> obj3 = new ObjectGen<String>(st);
        }
}


obj1 可编译是因为,T被指定为具体的类型,可通过。
obj2不可编译是因为,T无法被接受,报错信息:T无法被解析为一个type。
obj3可编译是因为,?不是固定类型,它可以接受Object下面任何子类。

作者: 淡淡柠檬茶    时间: 2014-6-5 13:01
李小然 发表于 2014-6-5 12:15
你给的两个方法在JVM看来是一样的

T指的是泛型的固定类型

谢谢 我记住了




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