如何摆脱&#34;类型安全:未经检查的从对象转换为地图<string,string>&#34;

时间:2016-01-22 22:31:09

标签: java dictionary spring-security

我使用下面的代码从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代码。

  

类型安全:从ObjectMap<String,String>

取消选中

2 个答案:

答案 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