Java 创建抽象泛型jaxb类

Java 创建抽象泛型jaxb类,java,generics,jaxb,annotations,Java,Generics,Jaxb,Annotations,我有以下简单的jaxB类,它采用泛型类型E @XmlAccessorType(XmlAccessType.FIELD) @XmlTransient @XmlRootElement(name = "searchResponseBase") public abstract class SearchResponseBase<E>{ @XmlElement(type=NameSearchResults.class) protected E searchResults;

我有以下简单的jaxB类,它采用泛型类型E

@XmlAccessorType(XmlAccessType.FIELD)
@XmlTransient
@XmlRootElement(name = "searchResponseBase")
public abstract class SearchResponseBase<E>{

    @XmlElement(type=NameSearchResults.class)
    protected E searchResults;

    public E getSearchResults()
    {
        return searchResults;
    }

    public void setSearchResults(E mSearchResults)
    {
        this.searchResults = mSearchResults;
    }

}

这是一个扩展它的类的示例

扩展类

@SuppressWarnings("javadoc")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {
    "searchRequest",
    "searchResults"
})
@XmlRootElement(name = "searchResponse")
public class SearchResponse extends SearchResponseBase<NameSearchResults> {

    @XmlElement(required = true)
    protected SearchRequest searchRequest;

    public SearchRequest getSearchRequest() {
        return searchRequest;
    }

    public void setSearchRequest(SearchRequest value) {
        this.searchRequest = value;
    }
}
@SuppressWarnings(“javadoc”)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(比例器={
“搜索请求”,
“搜索结果”
})
@XmlRootElement(name=“searchResponse”)
公共类SearchResponse扩展了SearchResponseBase{
@XmlElement(必需=true)
受保护的搜索请求搜索请求;
公共搜索请求getSearchRequest(){
返回搜索请求;
}
public void setSearchRequest(SearchRequest值){
this.searchRequest=值;
}
}
如何使基类实际上是泛型的

最好我希望我的扩展类以
SearchResponse扩展SearchResponseBase
的格式工作,并将其用作泛型类型

如果我按照保罗的建议做,我可以让全班同学:

@XmlRootElement(name = "searchResponse")
public class SearchResponse<E extends NameSearchResults> extends SearchResponseBase<E> {

    @XmlElement(required = true)
    protected SearchRequest searchRequest;

    protected E searchResults;

    public SearchRequest getSearchRequest() {
        return searchRequest;
    }

    public void setSearchRequest(SearchRequest value) {
        this.searchRequest = value;
    }

    @Override
    public E getSearchResults() {
        return searchResults;
    }

    @Override
    public void setSearchResults(E mSearchResults) {
        this.searchResults = mSearchResults;
    }  
}
@XmlRootElement(name=“searchResponse”)
公共类SearchResponse扩展了SearchResponseBase{
@XmlElement(必需=true)
受保护的搜索请求搜索请求;
受保护的电子搜索结果;
公共搜索请求getSearchRequest(){
返回搜索请求;
}
public void setSearchRequest(SearchRequest值){
this.searchRequest=值;
}
@凌驾
公共E-getSearchResults(){
返回搜索结果;
}
@凌驾
公共无效集合搜索结果(E mSearchResults){
this.searchResults=mSearchResults;
}  
}

有没有办法把NameSearchResults从这个
中推出来?

我不熟悉JAXB,但是你可以尝试创建
getSearchResults
setSearchResults
抽象方法,并且只有在
E
被解析后才能实现它们。例如:

//annotations ommitted
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);
}

//annotations ommitted
public class SearchResponse extends SearchResponseBase<NameSearchResults> {

    @XmlElement(type=NameSearchResults.class)
    protected NameSearchResults searchResults;

    @Override
    public final NameSearchResults getSearchResults() {
        return searchResults;
    }

    @Override
    public final void setSearchResults(NameSearchResults mSearchResults) {
        this.searchResults = mSearchResults;
    }

    ...
}
//注释已写入
公共抽象类SearchResponseBase{
公共摘要E getSearchResults();
公开摘要无效集合搜索结果(E mSearchResults);
}
//注释不匹配
公共类SearchResponse扩展了SearchResponseBase{
@XmlElement(类型=NameSearchResults.class)
受保护名称搜索结果搜索结果;
@凌驾
公共最终名称搜索结果getSearchResults(){
返回搜索结果;
}
@凌驾
公共最终作废集合搜索结果(NameSearchResults mSearchResults){
this.searchResults=mSearchResults;
}
...
}

我不熟悉JAXB,但您可以尝试创建
getSearchResults
setSearchResults
抽象方法,并仅在解析
E
时实现它们。例如:

//annotations ommitted
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);
}

//annotations ommitted
public class SearchResponse extends SearchResponseBase<NameSearchResults> {

    @XmlElement(type=NameSearchResults.class)
    protected NameSearchResults searchResults;

    @Override
    public final NameSearchResults getSearchResults() {
        return searchResults;
    }

    @Override
    public final void setSearchResults(NameSearchResults mSearchResults) {
        this.searchResults = mSearchResults;
    }

    ...
}
//注释已写入
公共抽象类SearchResponseBase{
公共摘要E getSearchResults();
公开摘要无效集合搜索结果(E mSearchResults);
}
//注释不匹配
公共类SearchResponse扩展了SearchResponseBase{
@XmlElement(类型=NameSearchResults.class)
受保护名称搜索结果搜索结果;
@凌驾
公共最终名称搜索结果getSearchResults(){
返回搜索结果;
}
@凌驾
公共最终作废集合搜索结果(NameSearchResults mSearchResults){
this.searchResults=mSearchResults;
}
...
}

多亏@PaulBellora的帮助,基类和扩展类都将变得抽象,然后有一个名称实现,如下所示:

基础

@XmlRootElement(name = "searchResponseBase")
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);

}
@XmlRootElement(name = "searchResponse")
public abstract class SearchResponse<E> extends SearchResponseBase<E>{

    public abstract SearchRequest getSearchRequest();

    public abstract void setSearchRequest(SearchRequest value);   
}
@XmlRootElement(name=“searchResponseBase”)
公共抽象类SearchResponseBase{
公共摘要E getSearchResults();
公开摘要无效集合搜索结果(E mSearchResults);
}
扩展基数

@XmlRootElement(name = "searchResponseBase")
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);

}
@XmlRootElement(name = "searchResponse")
public abstract class SearchResponse<E> extends SearchResponseBase<E>{

    public abstract SearchRequest getSearchRequest();

    public abstract void setSearchRequest(SearchRequest value);   
}
@XmlRootElement(name=“searchResponse”)
公共抽象类SearchResponse扩展了SearchResponseBase{
公共摘要SearchRequest getSearchRequest();
公共摘要void setSearchRequest(SearchRequest值);
}
名称实现

@XmlRootElement(name = "nameSearchResponse")
public class NameSearchResponse extends SearchResponse<NameSearchResults>{

    @XmlElement(required = true)
    protected SearchRequest searchRequest;

    protected NameSearchResults searchResults;

    @Override
    public NameSearchResults getSearchResults() {
        return searchResults;
    }

    @Override
    public void setSearchResults(NameSearchResults mSearchResults) {
        this.searchResults = mSearchResults;
    }

    @Override
    public SearchRequest getSearchRequest() {
        return searchRequest;
    }

    @Override
    public void setSearchRequest(SearchRequest value) {
        this.searchRequest = value;
    }
}
@XmlRootElement(name=“nameSearchResponse”)
公共类NameSearchResponse扩展了SearchResponse{
@XmlElement(必需=true)
受保护的搜索请求搜索请求;
受保护名称搜索结果搜索结果;
@凌驾
公共名称搜索结果getSearchResults(){
返回搜索结果;
}
@凌驾
public void setSearchResults(NameSearchResults mSearchResults){
this.searchResults=mSearchResults;
}
@凌驾
公共搜索请求getSearchRequest(){
返回搜索请求;
}
@凌驾
public void setSearchRequest(SearchRequest值){
this.searchRequest=值;
}
}

多亏@PaulBellora的帮助,基类和扩展类都将变得抽象,然后有一个名称实现,如下所示:

基础

@XmlRootElement(name = "searchResponseBase")
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);

}
@XmlRootElement(name = "searchResponse")
public abstract class SearchResponse<E> extends SearchResponseBase<E>{

    public abstract SearchRequest getSearchRequest();

    public abstract void setSearchRequest(SearchRequest value);   
}
@XmlRootElement(name=“searchResponseBase”)
公共抽象类SearchResponseBase{
公共摘要E getSearchResults();
公开摘要无效集合搜索结果(E mSearchResults);
}
扩展基数

@XmlRootElement(name = "searchResponseBase")
public abstract class SearchResponseBase<E>{

    public abstract E getSearchResults();

    public abstract void setSearchResults(E mSearchResults);

}
@XmlRootElement(name = "searchResponse")
public abstract class SearchResponse<E> extends SearchResponseBase<E>{

    public abstract SearchRequest getSearchRequest();

    public abstract void setSearchRequest(SearchRequest value);   
}
@XmlRootElement(name=“searchResponse”)
公共抽象类SearchResponse扩展了SearchResponseBase{
公共摘要SearchRequest getSearchRequest();
公共摘要void setSearchRequest(SearchRequest值);
}
名称实现

@XmlRootElement(name = "nameSearchResponse")
public class NameSearchResponse extends SearchResponse<NameSearchResults>{

    @XmlElement(required = true)
    protected SearchRequest searchRequest;

    protected NameSearchResults searchResults;

    @Override
    public NameSearchResults getSearchResults() {
        return searchResults;
    }

    @Override
    public void setSearchResults(NameSearchResults mSearchResults) {
        this.searchResults = mSearchResults;
    }

    @Override
    public SearchRequest getSearchRequest() {
        return searchRequest;
    }

    @Override
    public void setSearchRequest(SearchRequest value) {
        this.searchRequest = value;
    }
}
@XmlRootElement(name=“nameSearchResponse”)
公共类NameSearchResponse扩展了SearchResponse{
@XmlElement(必需=true)
受保护的搜索请求搜索请求;
受保护名称搜索结果搜索结果;
@凌驾
公共名称搜索结果getSearchResults(){
返回搜索结果;
}
@凌驾
public void setSearchResults(NameSearchResults mSearchResults){
this.searchResults=mSearchResults;
}
@凌驾
公共搜索请求getSearchRequest(){
返回搜索请求;
}
@凌驾
公共研究