【发布时间】:2023-03-24 13:04:01
【问题描述】:
我有一个案例,我正在尝试使用多态性和方法签名以及强制转换。
我有一个这样的界面:
<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 或其他任何东西,所以它会抱怨对象
我如何真正利用它来编译和工作?感觉应该很简单,使用父母、泛型等来发送我直到运行时才知道的类型。也许我让它变得不必要的复杂。
【问题讨论】:
-
我不明白你的代码在做什么。您使用
Class作为参数调用 isInstance ,这看起来很奇怪。map函数和你问题的第一部分有什么关系? -
你的单元测试试图传递一个对象来进行转换,但是
convert方法没有接受一个数据对象;它只接受一个类。也许方法的签名应该是convert(Object objectToConvert, Class<T> resultType, ParameterType type)? -
@tgdavies 对不起,它应该说转换,而不是映射。基本上,我想接受一个未知类型的类(可以是许多类型中的一个),将它传递给 convert 方法,为它们中的每一个设置一个案例,然后调用一个适当的转换器。然后为每个返回一个不同的对象。
-
如果您编辑您的问题以显示您想要做的完整的玩具示例会更好。它应该是可编译的,除了您遇到的单个编译时错误。
标签: java generics polymorphism