java方法的返回值能保证类型安全吗?
我以Spring的ResponseEntity为例,但我不确定为什么在方法签名中指定泛型的类型通常有效。如果我有一个返回ResponseEntity的控制器方法,那么当我在方法中创建ResponseEntity时,似乎不需要再次指定String
这相当于“ArrayList=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 楼答案
正确,从Java 7开始,编译器可以推断类型,而无需显式定义。见:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
从Spring Java文档中可以看到
ResponseEntity
声明为public class ResponseEntity<T> extends HttpEntity<T>
,因此当您指定ResponseEntity<String>
作为返回类型时,Java编译器可以在返回语句return new ResponseEntity<>(...)
中推断出这一点