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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xuqangxing 中级黑马   /  2013-5-9 16:08  /  1791 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xuqangxing 于 2013-5-9 19:34 编辑

Vector<String> v=new Vector<Object>();
Vector<Object> v=new Vector<String>();
参数类型不考虑类型参数的继承关系,所以上面两个的写法不正确,那下面两个不也类似吗?为什么下面的写法行呢?
Integer 是Number的子类,String 是Object 的子类
Vector<? super Integer>x=new Vector<Number>();
Vector<? extends Number>y=new Vector<Integer>();

3 个回复

倒序浏览
本帖最后由 zms2100 于 2013-5-9 18:37 编辑

class vector
{
    public static void main(String[] args)
    {
       //Vector<String> v1=new Vector<Object>();     //这个很明显肯定是不行的,不解释。
       //Vector<Object> v2=new Vector<String>();    //这个不好解释,不太懂,仅当帮助LZ理解吧,LZ是想用多态的特性来实现,在这里应该是被禁止的。

       贴一下API中在构造函数的常见代码 :   Collection<? extends E>  这是API中对需要使用集合时 对集合的定义方式。
       这里对集合容器的声明时允许使用多态的特性,Collection指向Vector等;

        通常来讲在定义集合时是 用来定义类型的泛型是 T ,但是它是要指定具体类型的(就像上面);
        而当我们创建一个集合却不能明确初始化的类型是什么时(当然必须是一个继承体系的),那么就可以使用带范围的通配符泛型(泛型上限符或下限符)。
        所以下面就是能够通过编译、运行的。
        Vector<? super Integer>x=new Vector<Number>();   
        Vector<? extends Number>y=new Vector<Long>();               //同上面讲的,Number是Integer、Long等的超类,使用通配符泛型后就能初始化定义为子类或父类等。
                                                                                                                                                                                           (当然是根据泛型通配符号来定义)
        仅供参考,具体的我也不太懂,这好像是泛型的高级应用,LZ可以了解下,或期待大神们来指点我们,O(∩_∩)O~
回复 使用道具 举报
zms2100 发表于 2013-5-9 17:59
class vector
{
    public static void main(String[] args)

谢谢哦 :handshake
回复 使用道具 举报
xuqangxing 发表于 2013-5-9 19:34
谢谢哦

客气,O(∩_∩)O~..........不过我也在这学到了,原来? super T 是可以在这里使用的,呵呵,受教了,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马