类中的java嵌套泛型多态返回类型

n8ghc7c1  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(555)

我有一个类,它将包含要发送到ui的响应。蓝图如下:

  1. class Response<T extends CustomObject> {
  2. private String var1;
  3. private String var2;
  4. private List<T> custom; (eg. customOne, customTwo)
  5. }

我可以有不同的对象,比如扩展customobject的自定义对象,并且基于该响应类将有不同的customobject列表。
在应用了服务逻辑之后,我得到了一个原始的响应,并根据定制对象尝试进行不同的解析。
cusomone和customtwo的结构不同:

  1. class CustomOne extends CustomObject {
  2. private String v1;
  3. }
  4. class CustomTwo extends CustomObject {
  5. private String v2;
  6. }

我有一个抽象的解析函数,它将根据拾取的对象调用。功能定义为:

  1. public abstract ResponsePayLoad<? extends CustomObject> parseResponse(String response);

reponsepayload是另一个具有包括customobject在内的其他字段的类。类responsepayload的蓝图如下:

  1. class ResponsePayLoad<T extends CustomObject> {
  2. private String varX;
  3. private List<T> value;
  4. }

两个customobjects的解析函数如下所示:

  1. public ResponsePayLoad<customOne> parseResponse(String response){
  2. CustomOne one = ; // parsingLogic
  3. return one;
  4. }
  5. public ResponsePayLoad<customTwo> parseResponse(String response){
  6. CustomTwo two = ; // parsingLogic
  7. return two;
  8. }

在我的服务逻辑中,当我将代码编写为:

  1. ResponsePayLoad<CustomObject> responseObj = parseResponse(response);

我要把它打给responsepayload,我不想。
有谁能告诉我,在抽象函数中如何跳过“?”而保持相同的逻辑?此外,我不想像上面定义的那样进行类型转换。任何帮助都将不胜感激。

r6hnlfcb

r6hnlfcb1#

你要投的理由

  1. ResponsePayLoad<CustomObject> responseObj = parseResponse(response);

自从 parseResponse 方法返回未知类型的responsepayload( ResponsePayLoad<? extends CustomObject> ).
这里要理解的是,未知类型可以是 CustomObject . 可能是的 CustomObject 它本身(比如你的例子),或者它的一些子类( CustomOne , CustomTwo 等等),但它不需要从字面上延伸 CustomObject .
因此将完整的响应转换为 ResponsePayload 进一步使其具有足够的通用性,尽管在执行此操作时编译器必须警告您未检查的强制转换。
关于泛型通配符的文档用一个更好的例子解释了这一点。
…如何在抽象函数中跳过“?”而保持相同的逻辑?
另一种避免显式类型转换的方法是返回 ResponsePayload 从你的 parseResponse 方法,将其声明为:

  1. public abstract ResponsePayLoad parseResponse(String response);
kiz8lqtg

kiz8lqtg2#

如果我理解正确的话,你可以返回 parseResponse 例如 ResponsePayLoad<CustomOne> 以及 ResponsePayLoad<CustomTwo> 分别。
那么就不可能将结果存储在 ResponsePayLoad<CustomObject> responseObj = parseResponse(response); 既然你不能贬低结果。以一种通用的方式 ResponsePayLoad<? extends CustomObject> responseObj = parseResponse(response); 但你还是把 CustomOne 以及 CustomTwo 对象作为 CustomObject 这意味着您正在丢失类型信息。那么,演员阵容是必要的。

相关问题