我使用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);
然后我(正确地)得到编译器警告。
答案 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}中推断出这一点。 }