方法的返回值是否保证类型安全?

时间:2016-05-11 15:26:53

标签: java spring generics type-safety

我使用Spring的ResponseEntity作为示例,但我不确定为什么在方法签名中指定泛型类型通常会起作用。如果我有一个返回ResponseEntity的控制器方法,那么当我在方法中创建ResponseEntity时,似乎我不需要再次指定String。

这相当于“ArrayList list = new ArrayList<>()”还是我误解了?

以下是Spring文档中的一个示例:

@RequestMapping("/handle")
public ResponseEntity<String> handle() {
   HttpHeaders responseHeaders = new HttpHeaders();
   responseHeaders.set("MyResponseHeader", "MyValue");
   return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}

IntelliJ代码分析会指出返回中的显式输入是多余的,所以我可以这样做:

return new ResponseEntity<>("Hello World", responseHeaders, HttpStatus.CREATED);

这是由于编译器检查方法签名还是有不太明显的事情发生?如果我将代码更改为:

return new ResponseEntity<>(123, responseHeaders, HttpStatus.CREATED);

然后我(正确地)得到编译器警告。

1 个答案:

答案 0 :(得分:1)

正确,从Java 7开始,编译器可以在不明确定义的情况下推断出类型。请参阅:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

从Spring JavaDocs中,您可以看到ResponseEntity声明为public class ResponseEntity<T> extends HttpEntity<T>所以当您指定ResponseEntity<String>作为返回类型时,Java编译器可以在return语句{{1}中推断出这一点。 }