如何摆脱“类型安全:从对象到 Map<String,String> 的未经检查的转换”

use*_*349 3 java dictionary spring-security

deviceId我使用下面的代码从 Spring Authentication 类中提取。

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"));
}
Run Code Online (Sandbox Code Playgroud)

如何克服此类型安全警告消息?我想避免添加Suprress Warnings标签。

类型安全:未经检查的强制转换从ObjectMap<String,String>

And*_*eas 5

你不能。

由于Authentication简单地将 的返回值定义getDetails()为 an Object,因此您必须进行强制转换,尽管Map会在运行时检查类型,但仍然不能保证它映射StringString(因为类型擦除)。

这意味着您可能会ClassCastException在稍后使用时获得 a Map。这就是警告试图告诉您的内容,您可以通过添加 来接受对此的责任@SuppressWarnings