首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的泛型子类型问题

java中的泛型子类型问题
EN

Stack Overflow用户
提问于 2012-04-01 00:35:38
回答 7查看 424关注 0票数 1

我正在尝试学习Java中的子类型,而我在泛型方面并不是一个更好的人,所以我遇到了这个问题或怀疑-

代码语言:javascript
复制
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

代码语言:javascript
复制
Cage<Lion> cageLion = new Cage<Lion>();
cageLion.addAnimal(lion);
cageLion.addAnimal(butterfly);

在Cage的情况下

代码语言:javascript
复制
Cage<Animal> cageAnimalLion = new Cage<Lion>();
cageAnimalLion.addAnimal(lion);
cageAnimalLion.addAnimal(butterfly); //Throwing Compile Error
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-04-01 00:42:09

这一行

代码语言:javascript
复制
 public <T> void addAnimal(T t){

可能应该是

代码语言:javascript
复制
 public void addAnimal(T t){
票数 4
EN

Stack Overflow用户

发布于 2012-04-01 00:42:02

像这样声明Cage类:

代码语言:javascript
复制
class Cage<T extends Animal> {
    public void addAnimal(T t) { ... }
}

如果您以以下方式声明addAnimal方法...

代码语言:javascript
复制
public void <T> addAnimal(T t)

..。您正在使用具有相同名称的不同类型参数“隐藏”T类型参数。这与您像这样声明方法是一样的:

代码语言:javascript
复制
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的子类型。

票数 4
EN

Stack Overflow用户

发布于 2012-04-01 00:43:46

因为CageAnimalCage是截然不同的东西。看一下如何为Cage定义泛型参数

代码语言:javascript
复制
public <T> void addAnimal(T t){

}

你放在方法上的这个<T>,意味着这个方法有它自己的泛型参数,不同于你在类中定义的参数。如果从方法签名中删除它,它将使用类的泛型参数。

例如。

代码语言:javascript
复制
public void addAnimal(T t)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9957713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档