为了账号安全,请及时绑定邮箱和手机立即绑定

在 POJO 中使用泛型

在 POJO 中使用泛型

catspeake 2021-07-16 18:40:55
我希望根据使用泛型的输入从一个方法返回多个不同的 POJO 对象响应。POJO 不是层次结构的一部分,即是完全独立的 POJO//POJO1class A1  implements Serializable {   // Instance variable with getter and setter}//POJO2class 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 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

问题是您试图让编译时类型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

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


查看完整回答
反对 回复 2021-07-29
?
波斯汪

TA贡献1811条经验 获得超4个赞

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


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

    }

}


查看完整回答
反对 回复 2021-07-29
  • 3 回答
  • 0 关注
  • 306 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信