如何从单个方法返回不同的数据类型?

Jig*_*ati 0 java java-8

我有以下代码.

我想根据状态代码得到不同的错误消息,如果成功它应该返回对象..如何从一个方法返回这种不同的数据类型?

public EstimateTimeResult getEstimateTime(@RequestBody EstimateTimeCall estimateTimeCall,@PathVariable("empid") Long empid) throws IOException{
        String URL=baseApi+"/estimates/time";
        if(estimateTimeCall.getProduct_id().isEmpty() || estimateTimeCall.getProduct_id()==null || estimateTimeCall.getProduct_id()==""){
            URL+="?start_latitude="+estimateTimeCall.getStart_latitude().toString()+"&start_longitude="+estimateTimeCall.getStart_longitude().toString();
        }else{
            URL+="?start_latitude="+estimateTimeCall.getStart_latitude().toString()+"&start_longitude="+estimateTimeCall.getStart_longitude().toString()+"&product_id="+estimateTimeCall.getProduct_id();
        }
        //Header Set
        HttpHeaders requestHeaders=getHeader(empid);
         //Do Request
         HttpEntity requestEntity=new HttpEntity(requestHeaders);
         ResponseEntity<EstimateTimeResult> response=restTemplate.exchange(URL,HttpMethod.GET,requestEntity,EstimateTimeResult.class);  
         org.springframework.http.HttpStatus statusCode=response.getStatusCode();            
         if(statusCode.value()==422){
             return "Required start latitude,longitude";
         }
         return  response.getBody();                    
    }
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 5

简单:在Java中不可能(除非您将返回类型更改为Object,但这是非常糟糕的做法).但是,"不推荐"将是更好的术语.

当然,你可以做这样的事情

class RequestResult {
  static enum Result { PASS, FAIL };
  private Whatever dataForPass;
  private SomethingElse dataForFail;

  Whatever get(){
    return get((dataForFail)->throw new RequestError(dataForFail));
  }

  Whatever get(ErrorHandler handler){
    if(dataForFail != null){
      return handler.handle(dataForFail);
    }
    return dataForPass;
  }
}

interface ErrorHandler{
   Whatever handle(SomethingElse dataForFail) throws RequestError;
}

class RequestError extends RuntimeException{
    SomethingElse data;
    RequestError(SomethingElse data){
         this.data=data;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你可以让RequestResult句柄如何获取Whatever/ SomethingElsedata,例如:

Whatever data = result.get((dataForFail) -> ...);
//or throws a RequestError if `SomethingElse` presented.
Whatever data = result.get(); 
Run Code Online (Sandbox Code Playgroud)

然后创建这样一个对象; 并根据具有所需数据的对象的实际结果设置.通过这样做,该方法的返回类型可以是RequestResult; 你可以用它来传递和失败的请求.但这不是"标准做法".

相反:您只在方法通过时返回一些内容.否则,您将抛出一个适当的异常,其中包含调用者需要提供有用错误消息的信息.

换句话说:你应该清楚地区分"快乐"和"不快乐"的道路.在Java中,你可以通过在出现问题时抛出异常来做到这一点.

  • @DonnachaConnolly因为这需要方法的用户进行"instanceof"检查.调用者可能知道"它应该是一个字符串",或者某个Xyz实例.但他必须*假设*; 使用Object只会删除所有特定类型的信息.Java是一种静态编译的语言; 通过返回Object,你可以"绕过"大部分内容.然后你也可以使用红宝石或其他动态语言,其中每只鸭子都是elefant或植物.或类似的东西. (3认同)