使用泛型匹配参数和返回类型

时间:2018-07-18 09:32:07

标签: java generics

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

示例:

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

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

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

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

编辑:

经过测试:

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

结果:

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

2 个答案:

答案 0 :(得分: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;
            }
        };

答案 1 :(得分:2)

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

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提出的类级通用参数的建议。