这将编译
public ResponseEntity<User> getUserById(@PathVariable(value = "id") Long userId) throws UserNotFoundException {
ResponseEntity u = userRepository.findById(userId)
.map(p->ResponseEntity.ok(new UserResource(p)))
.orElseThrow(() -> new UserNotFoundException(userId));
return u;
}
但这不会
public ResponseEntity<User> getUserById(@PathVariable(value = "id") Long userId) throws UserNotFoundException {
return userRepository.findById(userId)
.map(p->ResponseEntity.ok(new UserResource(p)))
.orElseThrow(() -> new UserNotFoundException(userId));
}
怎么来?
答案 0 :(得分:3)
第一个代码段返回ResponseEntity<UserResource>
的实例,然后将其分配给原始类型变量。然后将原始类型变量返回到通用类型的变量(这将产生警告)。如果任何代码到达错误类型的ResponseEntity的字段,它将在运行时引发异常。因此第一个代码进行编译是因为编译器允许将原始类型变量分配给泛型,反之亦然。
第二个代码段不使用原始类型,因此完成了泛型类型兼容性检查(通常在编译时,因为由于擦除,泛型在运行时不存在)-因此它正确地无法编译。