继承泛型

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


List<T extends Response<T>>?只是在胡思乱想。 - John Dvorak
@JanDvorak:那不是有效的Java语法。 - newacct
3个回答

3
使用Put-Get-Rule。即,返回List<? extends Response<?>>但接受List<? super Response<?>>作为参数。在内部,您将将列表存储为List<Response>
需要注意的是,在接口上返回List<? extends Response<?>>可能会对消费者造成侵入性。在大多数情况下,最好让接口固定泛型类型,这样如果可能的话,您将返回类似于List<Response<MyType>>的内容。

1

你的Response类应该像这样定义:

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

因此,声明为SectionResponseFormResponse的内容将有一个包含它们自己的列表。

现在,直接回答您的问题,对于可以包含任何一种类型的列表,您只需要使用List<Response<?>>

然而,您可能需要更多——您可能想要从列表中取出元素并对它们进行某些操作。如果您能更具体地说明您需要做什么,我们可以为您提供进一步的帮助。


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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接