我正在尝试学习Java中的子类型,而我在泛型方面并不是一个更好的人,所以我遇到了这个问题或怀疑-
import java.util.ArrayList;
import java.util.Collection;
interface Animal<T>{}
class Lion implements Animal<Lion>{}
class Butterfly implements Animal<Butterfly>{}
class Cage<T>{
public <T> void addAnimal(T t){
}
}
interface CageAnimal<E> extends Collection<E>{}
public class SubType<T> {
public <T> SubType() {
Lion lion = new Lion();
Butterfly butterfly = new Butterfly();
/**
* **Here inside Lion cage, we added Butterfly : WRONG**
*/
Cage<Lion> cageLion = new Cage<Lion>();
cageLion.addAnimal(lion);
cageLion.addAnimal(butterfly);
CageAnimal<Lion> cageAnimalLion = (CageAnimal<Lion>) new ArrayList<Lion>();
cageAnimalLion.add(lion);
//cageAnimalLion.add(butterfly);//Butterfly is Not Supposed to add here as it is the cage of Lion
}
}在上面的示例中,当我声明Cage时,为什么我可以添加Butterfly,而在相同的情况下,当我创建CageAnimal类型时,我无法添加任何Buttefly
Cage<Lion> cageLion = new Cage<Lion>();
cageLion.addAnimal(lion);
cageLion.addAnimal(butterfly);在Cage的情况下
Cage<Animal> cageAnimalLion = new Cage<Lion>();
cageAnimalLion.addAnimal(lion);
cageAnimalLion.addAnimal(butterfly); //Throwing Compile Error发布于 2012-04-01 00:42:09
这一行
public <T> void addAnimal(T t){可能应该是
public void addAnimal(T t){发布于 2012-04-01 00:42:02
像这样声明Cage类:
class Cage<T extends Animal> {
public void addAnimal(T t) { ... }
}如果您以以下方式声明addAnimal方法...
public void <T> addAnimal(T t)..。您正在使用具有相同名称的不同类型参数“隐藏”T类型参数。这与您像这样声明方法是一样的:
class Cage<T extends Animal> {
public void <X> addAnimal(X t) { ... }
}显然,...which没有尽到自己的职责。另一方面,在我编写的第一个版本中,类和方法的声明中的T是相同的。
此外,声明<T extends Animal>绑定确保了框架只能是扩展Animal的类型,即Cage<Lion>,Cage<Butterfly>,但Cage<String>是非法的。
当然,您不能将ArrayList转换为CageAnimal,这将在运行时使用ClassCastException失败,因为ArrayList不是CageAnimal的子类型。
发布于 2012-04-01 00:43:46
因为CageAnimal和Cage是截然不同的东西。看一下如何为Cage定义泛型参数
public <T> void addAnimal(T t){
}你放在方法上的这个<T>,意味着这个方法有它自己的泛型参数,不同于你在类中定义的参数。如果从方法签名中删除它,它将使用类的泛型参数。
例如。
public void addAnimal(T t)https://stackoverflow.com/questions/9957713
复制相似问题