首页 > 解决方案 > 如何在方法签名中使用多态性、泛型?

问题描述

我有一个案例,我正在尝试使用多态性和方法签名以及强制转换。

我有一个这样的界面:

<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或其他任何东西,所以它抱怨对象

我如何真正利用它来编译和工作?感觉应该很简单,使用父母、泛型等来发送我直到运行时才知道的类型。也许我让它变得不必要的复杂。

标签: javagenericspolymorphism

解决方案


您的方法签名不正确。

对于 castClass 函数,您定义的第一个参数是Object,但是在调用此函数时,您正在传递一个Class实例。

此外,主转换函数仅Class在方法定义中采用实例,当您Object在测试用例中传递给它时。


推荐阅读