3

假设我有一个这样定义的抽象类:

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 方法,因为参数是参数化类型。

4

3 回答 3

3

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

作为说明,我会警惕返回List<? extends Response<?>>界面,因为它可能会侵入消费者。在大多数情况下,最好让接口确定泛型类型,以便您List<Response<MyType>>尽可能返回类似的东西。

于 2013-03-18T20:07:15.307 回答
1

你的Response类应该这样定义:

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

这样SectionResponseFormResponse,正如声明的那样,将有一个自己的列表。

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

但是,您可能想要的不止这些——您可能想要从列表中取出元素并对它们做点什么。如果您可以更具体地了解您需要做什么,我们可以为您提供进一步的帮助。

于 2013-03-18T22:27:01.263 回答
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);
    }
}
于 2013-03-18T23:41:23.907 回答