在POJO中使用泛型

时间:2018-08-17 20:37:50

标签: java generics optional

我希望根据使用泛型的输入,从一个方法返回多个不同的POJO对象响应。 POJO不是层次结构的一部分,即完全独立的POJO

//POJO1
class A1  implements Serializable {

   // Instance variable with getter and setter

}

//POJO2
class B1 implements Serializable {

  // Instance variable with getter and setter

}


class XYZ {

   private ObjA objA;
   private ObjB objB;

   public <T>Optional<T>  getResponse(String input) {


       if(input.equals("A")) {       
           return objA.getResponse();  // This returns an optional of POJO A1 or Optional.empty()
       } else {
           return objB.getResponse();  // This returns an optional of POJO B1 or Optional.empty()
       }
   }
}

但是我收到错误Incompatible types. Required Optional<T> but 'of' was inferred to Optional<T>: no instance(s) of type variable(s) exist so that A1 conforms to T inference variable T has incompatible bounds: equality constraints: T lower bounds: A1

我尝试将通用标签附加到POJO类定义,但无济于事。有人可以指出我在哪里出问题了吗?

3 个答案:

答案 0 :(得分:6)

问题是您试图让编译时类型T取决于input的运行时值,而这是不可能的。由于该值是动态的,因此您无法知道将返回哪种类型,因此正确的方法是使用Optional<?>

public Optional<?>  getResponse(String input) {
   if(input.equals("A")) {       
       return objA.getResponse();  // This returns an optional of POJO A1 or Optional.empty()
   } else {
       return objB.getResponse();  // This returns an optional of POJO B1 or Optional.empty()
   }
}

如果input 的值是静态已知的,则可以创建2个具有不同返回类型的方法:

public Optional<A1> getResponseA1() {
    return objA.getResponse();
}

public Optional<B1> getResponseB1() {
    return objB.getResponse();
}

并调用其中之一而不是传递字符串,例如:

// Optional<?> result = xyz.getResponse("A"); // Not this
Optional<A1> result = xyz.getResponseA1(); // But this

或者您可以同时使用两种方法,让调用者根据是否知道字符串的值来决定使用哪种方法。

答案 1 :(得分:0)

您可以投射:

if(input.equals("A")) {       
    return (T) objA.getResponse();
} else {
    return (T) objB.getResponse();
}

请注意,尽管这将解决编译问题,但不能保证类型安全,因为目标类型在技术上仍可能与返回的实际对象不兼容。

还假定呼叫者应该期望Optional<A1>Optional<B1>

答案 2 :(得分:0)

您是否希望根据函数输入确定类型?

public <T>Optional<T>  getResponse(String input) {

此函数的返回T始终是调用方法中指定的。

请考虑以下内容:

public Optional<Serializable> getResponse(String input) {

然后在使用该功能时,您可以执行以下操作:

Optional<Serializable> s = getResponse("test");
s.ifPresent(sPresent -> {
    if(sPresent instanceof A1.class) {
        //logic for A1
    } else if(sPresent instanceof B1.class) {
        //logic for B1
    } else {
        //throw exception
    }
}