在 POJO 中使用泛型

我希望根据使用泛型的输入从一个方法返回多个不同的 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 类定义,但无济于事。有人可以指出我哪里出错了吗?


catspeake
浏览 307回答 3
3回答

慕村225694

问题是您试图让编译时类型T取决于 的运行时值input,这是不可能的。由于该值是动态的,您无法知道将返回哪种类型,因此正确的做法是使用Optional<?>:public Optional<?>&nbsp; getResponse(String input) {&nbsp; &nbsp;if(input.equals("A")) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return objA.getResponse();&nbsp; // This returns an optional of POJO A1 or Optional.empty()&nbsp; &nbsp;} else {&nbsp; &nbsp; &nbsp; &nbsp;return objB.getResponse();&nbsp; // This returns an optional of POJO B1 or Optional.empty()&nbsp; &nbsp;}}如果 的值input 是静态已知的,您可以创建 2 个具有不同返回类型的方法:public Optional<A1> getResponseA1() {&nbsp; &nbsp; return objA.getResponse();}public Optional<B1> getResponseB1() {&nbsp; &nbsp; return objB.getResponse();}并调用其中之一而不是传递字符串,例如:// Optional<?> result = xyz.getResponse("A"); // Not thisOptional<A1> result = xyz.getResponseA1(); // But this或者您可以同时使用这两种方法,并让调用者根据他们是否知道字符串的值来决定使用哪一种。

波斯汪

您是否希望根据函数的输入来确定类型?public <T>Optional<T>&nbsp; getResponse(String input) {此函数的返回 T 将始终是调用方法中指定的。而是考虑这样的事情:public Optional<Serializable> getResponse(String input) {然后在使用该功能时,您可以执行以下操作:Optional<Serializable> s = getResponse("test");s.ifPresent(sPresent -> {&nbsp; &nbsp; if(sPresent instanceof A1.class) {&nbsp; &nbsp; &nbsp; &nbsp; //logic for A1&nbsp; &nbsp; } else if(sPresent instanceof B1.class) {&nbsp; &nbsp; &nbsp; &nbsp; //logic for B1&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; //throw exception&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java