Java 创建抽象泛型jaxb类
我有以下简单的jaxB类,它采用泛型类型EJava 创建抽象泛型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;
@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(){
返回搜索请求;
}
@凌驾
公共研究