我遇到了从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> {
}
答案 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%肯定),所以我怀疑你应该重命名你的功能(以我的情况为例)。