Java 是否有可能超级播放列表?
这听起来可能有点琐碎,但我真的无法找到问题的症结所在Java 是否有可能超级播放列表?,java,list,casting,Java,List,Casting,这听起来可能有点琐碎,但我真的无法找到问题的症结所在 List<Dog> dogs = getListOfDogs(); List<Cat> cats = getListOfCats(); feed(dogs); feed(cats); public void feed(List<Animal> animals) { // feed the animal: // depending on the type of animal, I migh
List<Dog> dogs = getListOfDogs();
List<Cat> cats = getListOfCats();
feed(dogs);
feed(cats);
public void feed(List<Animal> animals) {
// feed the animal:
// depending on the type of animal, I might want to give it
// different kind of food.
}
class Dog implements Animal { /**/ }
class Cat implements Animal { /**/ }
interface Animal { /**/ }
List dogs=getListOfDogs();
列表猫=getListOfCats();
喂(狗);
喂(猫);
公共饲料(列出动物){
//给动物喂食:
//根据动物的类型,我可能会给它
//不同种类的食物。
}
类Dog实现动物{/**/}
类Cat实现动物{/**/}
界面动物{/**/}
我所处的环境与上面描述的非常相似。
我们还假设getListOfDogs
和getListOfCats
是固定的,无法在这方面采取行动
当然,这样说是非法代码:feed
只接受List
类型,而我只能拥有List
和List
由于喂食
对于这两种动物来说是一个几乎相同的功能,除了食物的种类(我可以通过instanceof
来管理它),我希望避免复制它,只是更改签名
有没有办法超级播放这两张名单?类似这样的内容(这显然是错误的):
feed((List)getListOfDogs())代码>您要查找的是:
public void feed(List<? extends Animal> animals) {
public void提要(List如果它不允许您直接强制转换到List
,那么您可以在不使用泛型参数的情况下强制转换到List
,然后再转换到List
,但这不是一个好方法
这不是一个好方法,因为一旦更改了通用参数,就可以将猫放入狗的列表中
相反,feed函数的参数应该看起来不同
public void feed(List<? extends Animal> animals) {
// feed the animal:
}
public-void-feed(List你可以做你说过你想做的事,通过如下声明feed
:
public void feed(List<? extends Animal> animals)
…然后
public void feed(List<Dog> animals) {
this.feed(animals, this.dogFood);
}
public void feed(列出动物){
喂(动物,狗食);
}
及
public void feed(列出动物){
这个。饲料(动物,这个。猫粮);
}
…或类似内容。feed
应该接受列表如果您没有看到它,这里有关于泛型和集合的有用讨论
public void feed(List<Dog> animals) {
this.feed(animals, this.dogFood);
}
public void feed(List<Cat> animals) {
this.feed(animals, this.catFood);
}