假设我是这样定义的抽象类:
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方法,因为参数是参数化类型。
答案 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;
}
因此,声明的SectionResponse
和FormResponse
会有自己的列表。
现在,从字面上回答你的问题,对于一个可以包含任何一个的列表,你可以只有一个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);
}
}