方法的 return 值是否保证类型安全?
Does a method's return value guarantee type safety?
我以 Spring 的 ResponseEntity 为例,但我不确定为什么在方法签名中指定泛型类型通常有效。如果我有一个 return 是 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 中的显式键入是多余的,因此我可以这样做:
return new ResponseEntity<>("Hello World", responseHeaders, HttpStatus.CREATED);
这是因为编译器正在检查方法签名还是发生了不太明显的事情?如果我将代码更改为:
return new ResponseEntity<>(123, responseHeaders, HttpStatus.CREATED);
然后我会(正确地)收到编译器警告。
正确,从Java 7开始,编译器可以在没有显式定义的情况下推断类型。参见:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
从 Spring Java文档中您可以看到 ResponseEntity
声明为 public class ResponseEntity<T> extends HttpEntity<T>
因此当您将 ResponseEntity<String>
指定为 return 类型时,Java 编译器可以在 return 语句 return new ResponseEntity<>(...)
中推断出这一点
我以 Spring 的 ResponseEntity 为例,但我不确定为什么在方法签名中指定泛型类型通常有效。如果我有一个 return 是 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 中的显式键入是多余的,因此我可以这样做:
return new ResponseEntity<>("Hello World", responseHeaders, HttpStatus.CREATED);
这是因为编译器正在检查方法签名还是发生了不太明显的事情?如果我将代码更改为:
return new ResponseEntity<>(123, responseHeaders, HttpStatus.CREATED);
然后我会(正确地)收到编译器警告。
正确,从Java 7开始,编译器可以在没有显式定义的情况下推断类型。参见:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
从 Spring Java文档中您可以看到 ResponseEntity
声明为 public class ResponseEntity<T> extends HttpEntity<T>
因此当您将 ResponseEntity<String>
指定为 return 类型时,Java 编译器可以在 return 语句 return new ResponseEntity<>(...)