【问题标题】:Matching A parameter and return type using generics使用泛型匹配参数和返回类型
【发布时间】:2018-07-18 09:32:06
【问题描述】:

可以使用泛型将返回类型与参数类型匹配吗?

示例:

我有一个抽象类,可以实现从不同 POJO 导入数据,这个类包含一个抽象方法 importData。

importData 返回的 Object 必须与传递给方法的 Object 类型相同。

public abstract POJO importData(final POJO dataObject, final String messageId);

由于抽象方法的每个实现的 Object 类型都不同,并且该类型不扩展另一个,如何定义抽象方法以使实现返回类型和传递的类型必须匹配?

编辑:

久经考验:

public abstract <T> T importData(final T jaxbObject, final String messageId);

结果:

方法的返回类型不必与传递的对象类型匹配。

【问题讨论】:

  • 只是想知道。如果您使用public abstract &lt;T&gt; T importData(final T jaxbObject, final String messageId);,实现类是如何设法返回除原始jaxbObject 之外的任何内容的?实现类不知道要实例化和返回什么对象。

标签: java generics


【解决方案1】:

您可以使用方法级别的泛型参数:

public abstract <T> T importData(final T dataObject, final String messageId);

请注意,此类型 T 可能因每次调用而异。例如以下是可能的:

POJO myPojo = myClass.importData(otherPojo, "messageId");
Integer someInt = myClass.importData(5, "otherMessageId");
String aSring = myClass.importData("Hello World", "anotherMessageId");

如果这不是您想要的,您可以使用@Leviand 提出的类级别泛型参数的建议。

【讨论】:

    【解决方案2】:

    您必须为您的类类型分配一个字母,该字母将在使用您的方法时根据您在调用方法时使用的类型进行分配

    public abstract T importData(final T dataObject, final String messageId);
    

    然后,您可以在实现中检查对象的类型以了解不同的行为

    YourAbstractClass c = new YourAbstractClass() {
                @Override
                public <T> T importData(T dataObject, String messageId) {
                    if(dataObject instanceof String){
                        //doSomething
                    }else if (dataObject instanceof POJO){
                        //do POJO things
                    }
                    return null;
                }
            };
    

    【讨论】:

    • 唯一的问题,这个解决方案是类必须承受T参数。
    • 已经尝试过这个并在一个实现中进行了测试,但是因为 T 隐式扩展了 Object 任何对象类型都可以返回
    • 好吧,让我理解一下:所以我们使用的T类必须实现一个接口?告诉我,我可以编辑答案:)
    • T 类不扩展接口,也不扩展其他对象
    • 因此,除了使用 instanceof 检查调用方法时收到的类型外,您无能为力。我将在我的答案中添加示例
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 2016-11-13
    • 2015-04-19
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2016-09-16
    • 2021-05-01
    相关资源
    最近更新 更多