我使用下面的代码从Spring Authentication类中提取deviceId
。
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import com.google.common.base.Optional;
public static Optional<String> getId() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!auth.isAuthenticated()) {
return Optional.absent();
}
// I see a warning as "Type safety: Unchecked cast from Object to Map<String,String>"
Map<String, String> details = (Map<String, String>) auth.getDetails();
return Optional.of(details.get("deviceId"));
}
如何克服此类型安全警告消息?我想避免添加Suprress Warnings
代码。
类型安全:从
取消选中Object
到Map<String,String>
答案 0 :(得分:2)
你不能。
由于Authentication
只是将getDetails()
的返回值定义为Object
,因此您必须进行强制转换,尽管在运行时将检查类型Map
,但仍然存在无法保证将String
映射到String
(因为type erasure)。
这意味着当<{1}}被使用时,可能稍后获得ClassCastException
。这就是警告试图告诉您的内容,您通过添加Map
来承担责任。
答案 1 :(得分:0)
在执行演员表之前检查类型。
if(auth.getDetails() instanceof Map){
//here your cast
}
...您的问题可能与以下内容重复: Type safety: Unchecked cast