当前位置: 首页 > 知识库问答 >
问题:

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

太叔豪
2023-03-14

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

实例案例:

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

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

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

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

经过考验:

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

结果:

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

共有2个答案

白越
2023-03-14

必须根据调用方法时使用的类型为类类型指定一个字母,该字母将在使用方法时指定

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;
            }
        };
沈博延
2023-03-14

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

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的类级泛型参数的建议。

 类似资料:
  • 我试图创建一个返回泛型类型参数的方法。 我有一个类车辆订单扩展抽象类订单。在类订单中,我创建了一个抽象方法接收HiredObject。这个方法不会接收任何参数,并将返回一个泛型。 我在VehicleOrder类中实现了这个方法,并将其设置为返回类参数vehicle。 问题是,当我实例化一个新的VeilceOrderorororororororororororororderororororororo

  • 我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。

  • 此外,是否可以说泛型通配符类型仅在方法的参数声明中才有意义?

  • 有四种不同的类型:地点、语言、技术和行业。每个类型都有一个存储库,可以返回这些类型的集合。例如位置列表。每个类型都有一个类型为String的name属性。有一个字符串列表。它可以包含位置、语言等名称。我想编写一个函数来查找那些与字符串列表名称匹配的类型实体(位置、语言、...)。我在想这样的事情: 这是不正确的,那么如何对集合进行查询,然后如何确定name属性是否存在呢?

  • 问题内容: 我试图理解Java泛型,它们似乎很难理解。例如,这很好… …就是这个… … 还有这个 … …但是不能编译: 有人可以用简单的语言解释发生了什么吗? 问题答案: 对于泛型类型,主要要了解的是它们不是协变的。 因此,尽管您可以这样做: 以下内容将无法编译: 这是为了避免您绕过通用类型的情况: 因此,一一讲解您的示例 1个 您的通用方法采用a ,而您采用;(基本上是)。可以分配给类型,并且编