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

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

我有一个类,它将包含要发送到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,我不想。
有谁能告诉我,在抽象函数中如何跳过“?”而保持相同的逻辑?此外,我不想像上面定义的那样进行类型转换。任何帮助都将不胜感激。

r6hnlfcb

r6hnlfcb1#

你要投的理由

ResponsePayLoad<CustomObject> responseObj = parseResponse(response);

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

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 这意味着您正在丢失类型信息。那么,演员阵容是必要的。

相关问题