继承泛型

时间:2013-03-18 20:01:16

标签: java generics inheritance

假设我是这样定义的抽象类:

public class Response<T> {
    private List<Response<T>> subResponses;
}

和两个定义如下的子类:

public class SectionResponse extends Response<SectionResponse> {
}

public class FormResponse extends Response<FormResponse> {
}

基本上,Response的所有子类都需要具有相同类的列表。现在代码中的其他地方我想要一个可以包含子类的Response对象列表。

在不使用原始类型的情况下定义此列表的最佳方法是什么?我已经尝试了List<? extends Response<?>>但是我不能在这样定义的List上调用add方法,因为参数是参数化类型。

3 个答案:

答案 0 :(得分:3)

使用Put-Get-Rule。即,返回List<? extends Response<?>>但接受List<? super Response<?>>作为参数。在内部,您可以将列表存储为List<Response>

作为一个注释,我会谨慎地在界面上返回List<? extends Response<?>>,因为它可以侵入消费者。在大多数情况下,接口最好确定泛型类型,以便尽可能返回List<Response<MyType>>之类的内容。

答案 1 :(得分:1)

您的Response课程应该像这样定义:

public class Response<T> {
    private List<T> subResponses;
}

因此,声明的SectionResponseFormResponse会有自己的列表。

现在,从字面上回答你的问题,对于一个可以包含任何一个的列表,你可以只有一个List<Response<?>>

但是,您可能想要更多 - 您可能希望从列表中取出元素并对它们执行某些操作。如果您可以更具体地了解您需要做什么,我们可以为您提供进一步的帮助。

答案 2 :(得分:0)

我承认我不确定你想做什么,但这很有用,至少触及你描述的问题:

public class Response<T extends Response> {
    private List<T> sl = new LinkedList<T>();

    protected void add(T resp) {
        sl.add(this);
    }
}

public class FormResponse extends Response<FormResponse> {
    public FormResponse() {
        add(this);
    }
}
相关问题