``` List<? extends GrantedAuthority> authorities=new ArrayList<>();```new ArrayList<>()在<中冒红>
时间: 2024-12-30 14:41:34 浏览: 8
`List<? extends GrantedAuthority> authorities = new ArrayList<>();` 这行代码是一个泛型列表声明,其中 `? extends GrantedAuthority` 表示这个列表可以存储任何实现了 `GrantedAuthority` 接口的对象。这里的 `<?>` 代表未知的具体类型,但它保证了列表中的元素一定是可以向上转型为 `GrantedAuthority` 的类型。
`new ArrayList<>()` 是创建一个空的 ArrayList 对象,用于存储那些动态指定类型的元素。由于 `<>` 冒红,这可能是由于 IDE 或编辑器的检查机制,它可能会警告说你没有明确指定列表的实际类型,因为类型参数被留给了 Java 编译器去推断。如果你想要消除这个警告,你可以提供具体的类型:
```java
List<GrantedAuthority> authorities = new ArrayList<>();
```
但是,因为你是使用了通配符,所以你仍然可以在运行时添加任何实现了 `GrantedAuthority` 的类实例。
相关问题
``` List<? extends GrantedAuthority> authorities=new ArrayList<>();```LIst容器冒红
在Java中,当你创建一个泛型类型的列表`List<? extends GrantedAuthority>`时,这个列表可以存储任意实现了`GrantedAuthority`接口的对象,但是你无法直接向其中添加元素,因为`? extends`意味着列表的元素是`GrantedAuthority`的某个未知子类,而不是确切的类型。这防止了向上转型(casting up the inheritance hierarchy),也就是说,你不能将`GrantedAuthority`类型的实例直接添加到这个列表。
例如:
```java
List<Authorizable> authorizables = new ArrayList<>();
authorities.addAll(authorizables); // 正确,因为都是Authorizable的子类
// 错误,不允许将GrantAuthority实例添加进去
authorities.add(new GrantAuthority()); // 需要指定具体子类
```
这种设计被称为"协变返回类型"(covariant return types),它的目的是为了提高代码的安全性和类型检查。如果尝试这样做,编译器会报错,提示你需要明确指定子类类型。
Collection<? extends GrantedAuthority> getAuthorities();中如何配置
`getAuthorities()` 方法用于获取用户的权限集合,返回类型为 `Collection<? extends GrantedAuthority>`。在 Spring Security 中,我们可以通过实现 `UserDetailsService` 接口的 `loadUserByUsername()` 方法来为用户分配权限,例如:
```java
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException(username + " not found");
}
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
if (user.isAdmin()) {
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
}
}
```
在上述代码中,我们首先通过 `UserRepository` 获取到指定用户名的用户信息,然后根据用户信息为其分配角色权限,最后创建 `UserDetails` 对象并返回。`GrantedAuthority` 接口代表了用户所拥有的权限,我们可以使用 `SimpleGrantedAuthority` 类来创建一个简单的权限对象。在这里,我们为所有用户都分配了 `ROLE_USER` 权限,如果用户是管理员,则额外分配 `ROLE_ADMIN` 权限。最后返回的 `User` 对象是 Spring Security 提供的默认实现,它包含了用户名、密码和权限集合等信息。
阅读全文