相传,在很久以前,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(ArrayLista) { cat b = new cat("老白"); a.add(b); }
我定义了一个addCat方法,参数是一个cat数组,作用是将一个cat对象加入cat数组中,可我想传入一个animal数组,也实现其中的效果,但如果想直接传递的话,编译器也直接报错,一般的方法是使用方法重载,可是,这样就造成了代码冗余。
得知到这个限制后,list苦心修炼,终于想到了解决办法。代码如下
public static void addCat(ArrayList a)
在泛型中加入?super,便能打破这一层限制,如果是子类传递给父类的话,只需加入?extends,
这一层限制便不存在了,但是,著名哲学家鲸鲨王说过,当你凝视深渊时,深渊也在凝视着你。(原文出自尼采)
list虽然通过这种方法打破了这种限制,但也给自己套上了另一层枷锁。当然,这都是后话了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)