【问题标题】:How to use Polymorphism, Generics in method signatures?如何在方法签名中使用多态性、泛型?
【发布时间】: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,所以我可以在那里发送任何对象。然后检查它是哪一个并调用适当的转换器。我要转换的类是一个共享同一个父类的类(许多类之一),因此方法中的类&lt;T&gt;

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&lt;T&gt; resultType, ParameterType type)
  • @tgdavies 对不起,它应该说转换,而不是映射。基本上,我想接受一个未知类型的类(可以是许多类型中的一个),将它传递给 convert 方法,为它们中的每一个设置一个案例,然后调用一个适当的转换器。然后为每个返回一个不同的对象。
  • 如果您编辑您的问题以显示您想要做的完整的玩具示例会更好。它应该是可编译的,除了您遇到的单个编译时错误。

标签: java generics polymorphism


【解决方案1】:

您的方法签名不正确。

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

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

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多