从getter返回泛型集合

时间:2014-08-16 14:16:56

标签: java generics collections

我遇到了从getter方法返回泛型集合的问题。我的班级看起来像这样:

public abstract class ContentGroup<E extends Content> extends Content {

    private List<E> childContents = new LinkedList<E>();

    public List<E> getChildContents() {
        return childContents;
    }
    ...
}

public class Container extends ContentGroup {

} 

当我调用getChildContents()方法时,它会返回一个列表,但不会返回扩展Content类的对象列表,因此我必须将返回值显式地转换为Content

public void doit(Container contentGroup) {

    //Why does get method return Object instead of Content?
    Content content = (Content) contentGroup.getChildContents().get(0); 
    ...
} 

修改

我更新了代码,以更好地反映实际的实施情况。正如其中一个答案所示,问题在于Container没有定义Type。问题解决了:

public class Container extends ContentGroup<Content> {

} 

2 个答案:

答案 0 :(得分:2)

您将 Generic Raw Type

混合在一起

查看方法参数,它不是Generic。

public void do(ContentGroup contentGroup) { // RAW type is used

它应该是通用的,否则在运行时你会在转换时遇到异常。

答案 1 :(得分:1)

要完成user3218114的回答,您应该执行以下操作:

class Content {
}

class ExtendedContent extends Content {

    void foo() {
    }
}

abstract class ContentGroup<E extends Content> extends Content {

    private List<E> childContents = new LinkedList<E>();

    public List<E> getChildContents() {
        return childContents;
    }
}

class ExtendedContentGroup extends ContentGroup<ExtendedContent> {
}

public class Toto {

    public <E extends Content> E toto(ContentGroup<E> contentGroup) {
        return contentGroup.getChildContents().get(0); 
    }

    public void bar() {
        ExtendedContent extendedContent = toto(new ExtendedContentGroup());
        extendedContent.foo();
    }
}

另请注意,我确实收到了编译错误,因为 do是Java中的保留字(可能来自我的IDE设置,但不是100%肯定),所以我怀疑你应该重命名你的功能(以我的情况为例)。