【问题标题】:How to Avoid casting when dealing inheritance with jackson与杰克逊处理继承时如何避免强制转换
【发布时间】:2020-07-29 14:19:30
【问题描述】:

用例:对于配置类,我需要使用翻译类。

我有 3 个配置类(A、B、C)和 3 个翻译类(X、Y、Z)。

A 是父配置类, (B,C) 是子类。同样,X 是父翻译器类,(Y,Z) 是子类。

翻译器 Y 翻译 B,翻译器 Z 翻译 C 即 (B -> Y, C -> Z)

现在,我收到一个字符串输入(用于配置类),我使用 jackson 将其反序列化为配置类 A 的类型。对于 Jackson,我已经提到了 subTypes,Jackson 能够将其反序列化为所需的子类型 B 或 C正确。

A a = new ObjectMapper().readValue(inputString, A.class)

现在,我想做类似的事情:

if(a.type == 'B') Y.process((B)a) // Since translator Y was for B subClass
if(a.type == 'C') Z.process((C)c)//  Since translator Z was for C subClass

有没有办法,我可以在这里避免类型转换。

【问题讨论】:

    标签: java inheritance design-patterns casting jackson


    【解决方案1】:

    我假设你已经像这样定义了process()

    public class Y
    {
        public void process( B b ) {…}
    }
    

    你可以添加

    …
    public void process( A b ) { process( (B) b ); }
    …
    

    但这只会将演员从顶部移到调用路径的下方,并稍微隐藏它。

    根据您的描述,没有办法避免演员表;无论哪种方式,您都需要它。

    【讨论】:

    • 正是我的意思,我尝试避免强制转换,但没有成功。我怀疑是不是很糟糕?我读到了关于选角的文章,我开始知道在某些情况下选角不是每次都可以避免的,而且总是不坏。在这种情况下是不是很糟糕?
    • 通常,当强制转换不可避免时,您应该重新考虑您的设计。那么继承在您的情况下是正确的模式吗? (在不知道更多细节的情况下,我不能说什么……)。有时演员只是一个肮脏的黑客,以缩短某些东西。但有时由于各种原因,这确实是不可避免的。但是你应该知道这些原因……
    • @VinayakSangar,在这种情况下投射是可以的,你应该保持原样。没有办法避免它。您可以使用Class.cast 方法,但这样做没有意义。
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2012-09-13
    • 2023-03-27
    • 1970-01-01
    • 2013-06-28
    • 2018-12-05
    • 2011-08-25
    相关资源
    最近更新 更多