3 回答
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
或者您可以同时使用这两种方法,并让调用者根据他们是否知道字符串的值来决定使用哪一种。
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
}
}
添加回答
举报