java - 如何在方法签名中使用多态性、泛型?
问题描述
我有一个案例,我正在尝试使用多态性和方法签名以及强制转换。
我有一个这样的界面:
<T extends ParentClass> convert(Class<T> clazz, ParameterType type)
我想在哪里返回一个孩子(不知道哪种类型),在方法中我接受另一个未知类和一个简单的枚举类型。目标是接收一个对象,将其转换为另一个对象,然后将其交还。
我在使用方面遇到问题,特别是在尝试对此进行测试时。这是实现:
@Override
public <T extends ParentClass> T convert(Class<T> clazz, ParameterType type)
//Check if clazz is an instance of a specific object and use that specific converter
if(clazz.isInstance(AnObject.class)) {
AbObjectConverter anObjectConverter = new anObjectConverter;
anObjectConverter.convert(castClass(clazz, AnObject.class);
}
目标不仅仅是AnObject
转换,所以我可以在那里发送任何对象。然后检查它是哪一个并调用适当的转换器。我要转换的类是一个共享同一个父类的类(许多类之一),因此是<T>
方法中的类。
CastClass 只是这样做:
private static<T> T castClass(Object o, Class<T> clazz) {
return clazz.isInstance(o) ? clazz.cast(o) : null;
}
我正在尝试为此进行单元测试,但我该如何做到这一点而不会出错?我想制作一个我想转换的对象,将它发送到我的方法并测试功能。例如:
@Test
public void testConvertingShouldSucceed() {
ObjectToConvert object = new ObjectToConvert();
object.setname("Hello");
service.convert(object, ApplicationType.CONVERT)
}
但这不起作用,因为我无法将我的对象转换为T
或其他任何东西,所以它抱怨对象
我如何真正利用它来编译和工作?感觉应该很简单,使用父母、泛型等来发送我直到运行时才知道的类型。也许我让它变得不必要的复杂。
解决方案
您的方法签名不正确。
对于 castClass 函数,您定义的第一个参数是Object
,但是在调用此函数时,您正在传递一个Class
实例。
此外,主转换函数仅Class
在方法定义中采用实例,当您Object
在测试用例中传递给它时。
推荐阅读
- python - Python:对列表中已有的项目进行分组并将它们反转
- javascript - Chart.js 中的同一个甜甜圈图是否可以有不同的厚度?
- python - matplotlib:如何添加像素值范围的图例?
- azure-logic-apps - 通过逻辑应用创建 Azure 服务总线主题和订阅
- python - 使用 pandas 转换年度数据
- php - 在没有已知_id的情况下按列名在mongodb中查找数据
- c# - C# OpenXML 插入的图像质量很差,模糊
- microsoft-dynamics - 时间条目审批流程 Dynamics 365
- spring-cloud-stream - 装饰 gcp-pubsub 流数据
- reactjs - 在 react-data-table-component 分页中启用搜索和移动分页