我有一个类,它将包含要发送到ui的响应。蓝图如下:
class Response<T extends CustomObject> {
private String var1;
private String var2;
private List<T> custom; (eg. customOne, customTwo)
}
我可以有不同的对象,比如扩展customobject的自定义对象,并且基于该响应类将有不同的customobject列表。
在应用了服务逻辑之后,我得到了一个原始的响应,并根据定制对象尝试进行不同的解析。
cusomone和customtwo的结构不同:
class CustomOne extends CustomObject {
private String v1;
}
class CustomTwo extends CustomObject {
private String v2;
}
我有一个抽象的解析函数,它将根据拾取的对象调用。功能定义为:
public abstract ResponsePayLoad<? extends CustomObject> parseResponse(String response);
reponsepayload是另一个具有包括customobject在内的其他字段的类。类responsepayload的蓝图如下:
class ResponsePayLoad<T extends CustomObject> {
private String varX;
private List<T> value;
}
两个customobjects的解析函数如下所示:
public ResponsePayLoad<customOne> parseResponse(String response){
CustomOne one = ; // parsingLogic
return one;
}
public ResponsePayLoad<customTwo> parseResponse(String response){
CustomTwo two = ; // parsingLogic
return two;
}
在我的服务逻辑中,当我将代码编写为:
ResponsePayLoad<CustomObject> responseObj = parseResponse(response);
我要把它打给responsepayload,我不想。
有谁能告诉我,在抽象函数中如何跳过“?”而保持相同的逻辑?此外,我不想像上面定义的那样进行类型转换。任何帮助都将不胜感激。
2条答案
按热度按时间r6hnlfcb1#
你要投的理由
自从
parseResponse
方法返回未知类型的responsepayload(ResponsePayLoad<? extends CustomObject>
).这里要理解的是,未知类型可以是
CustomObject
. 可能是的CustomObject
它本身(比如你的例子),或者它的一些子类(CustomOne
,CustomTwo
等等),但它不需要从字面上延伸CustomObject
.因此将完整的响应转换为
ResponsePayload
进一步使其具有足够的通用性,尽管在执行此操作时编译器必须警告您未检查的强制转换。关于泛型通配符的文档用一个更好的例子解释了这一点。
…如何在抽象函数中跳过“?”而保持相同的逻辑?
另一种避免显式类型转换的方法是返回
ResponsePayload
从你的parseResponse
方法,将其声明为:kiz8lqtg2#
如果我理解正确的话,你可以返回
parseResponse
例如ResponsePayLoad<CustomOne>
以及ResponsePayLoad<CustomTwo>
分别。那么就不可能将结果存储在
ResponsePayLoad<CustomObject> responseObj = parseResponse(response);
既然你不能贬低结果。以一种通用的方式ResponsePayLoad<? extends CustomObject> responseObj = parseResponse(response);
但你还是把CustomOne
以及CustomTwo
对象作为CustomObject
这意味着您正在丢失类型信息。那么,演员阵容是必要的。