美文网首页
Java解惑之Object、T(泛型)、?区别

Java解惑之Object、T(泛型)、?区别

作者: sofarsogoo_932d | 来源:发表于2018-09-26 19:56 被阅读0次

    先来看一段代码

    List<Object> list1 = new ArrayList<>();
    list1.add("hello");
    list1.add(0);
    
    List<String> list2 = new ArrayList<>();
    list2.add("world");
    
    List<?> list3 = new ArrayList<>();
    list3.add("1");
    

    我们知道List本省就是一个泛型类

    第一段代码中,我们传入了一个Object类型,当我们调用add方法时,可与传入任何类型的参数,因为任何类都是Object的子类

    第二段代码中,我们传入了一个String类型,相当于已经限定了T的类型就是String类型,因此当我们调用add方法时,只能传入String类型

    第三段代码中,在调用add方法时,编译器会报错

    区别

    三者的定义

    Object,任何类的父类
    T,泛型参数
    ?,类型通配符

    Object和<T>的区别

    由于Object是任何类的父类,因此它的范围会非常广
    T,在传入的时候就已经限定了参数的类型

    <T>和<?>的区别

    讨论“<T>"和"<?>",首先要区分开两种不同的场景:

    1. 声明一个泛型类或泛型方法
    2. 使用一个泛型类或泛型方法

    类型参数“<T>”主要用于第一种,声明泛型类或泛型方法。 无界通配符“<?>”主要用于第二种,使用泛型类或泛型方法。

    <T>声明泛型类的类型参数
     class Box<T>{
        private T item1;
        private T item2;
    }
    
    声明泛型类不能用无界通配符<?>
    //编译报错
    class Box<?>{
        private ? item1;
        private ? item2;
    }
    
    有界通配符<? extends XXX>,<? super XXX>

    <? extends XXX>或者<? super XXX>两种,带有上下界的通配符

    相关文章

      网友评论

          本文标题:Java解惑之Object、T(泛型)、?区别

          本文链接:https://www.haomeiwen.com/subject/reljoftx.html