关于java泛型的点点滴滴

关于java泛型的点点滴滴,第1张

关于java泛型的点点滴滴

相传,在很久以前,list与数组[]在万界山展开殊死大战,这场战斗持续了三天三夜,万界山尘土飞扬,天空中雷鸣电闪,外面的人,只看见那边一团黑,终于,list占了上风,数组[]那怕有通天法力,此刻也不过像一只被猎人射中的鹿,倒在地上,做垂死挣扎,list将剑指向了他,却并不着急杀他,欣赏着他脸上流露出的痛苦,他轻蔑的笑了笑,“属于你的时代已经过去,我将成为世界的法则。”“哼,不就是面向对象。”数组[]冷冷的看着list,随后却轻蔑的笑了笑,“既然你这么自信面向对象的力量,那我就以上神的名义诅咒你,声明的子类集合不能赋值给父类,声明的父类集合不能赋值给子类。”"这",list楞了一下,终于明白了这句话的含义。数组[]看到了list脸上惊恐的神清,狂笑了起来,终于是失去了身体中的所有力气,倒了下去,list木讷的站在那,脸上的骄傲早已荡然无存。

java泛型的一个性质—协变,子类的泛型类型也属于泛型类型的子类,简单来说,就是声明的子类集合不能赋值给父类,声明的父类集合不能赋值给子类。

举个栗子

   public static class cat extends animal {
        public cat(String name) {
            super(name);
        }
    }

    public static class animal {
        String name;

        public animal(String name) {
            this.name = name;
        }
    }

在这里定义了一个动物类,和一个继承了动物类的猫类,如果我定义一个数组,想

 ArrayList animals = new ArrayList();

这样做,或者

       ArrayList animals = new ArrayList();

这样做,都会直接报错,可有时候我们又不得不面临这样的情况。

    public static void addCat(ArrayList a) {
        cat b = new cat("老白");
        a.add(b);
    }

我定义了一个addCat方法,参数是一个cat数组,作用是将一个cat对象加入cat数组中,可我想传入一个animal数组,也实现其中的效果,但如果想直接传递的话,编译器也直接报错,一般的方法是使用方法重载,可是,这样就造成了代码冗余。

得知到这个限制后,list苦心修炼,终于想到了解决办法。代码如下

  public static void addCat(ArrayList a)

在泛型中加入?super,便能打破这一层限制,如果是子类传递给父类的话,只需加入?extends,

这一层限制便不存在了,但是,著名哲学家鲸鲨王说过,当你凝视深渊时,深渊也在凝视着你。(原文出自尼采)

list虽然通过这种方法打破了这种限制,但也给自己套上了另一层枷锁。当然,这都是后话了

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5120330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存