方法的 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<>(...)

中推断出这一点