java - java.util.Map 键和值的运行时类型

标签 java spring types dictionary dependency-injection

问题:
我试图找到 map 的键和值的java类型,但不必迭代 map 然后使用instanceof,并且即使 map 是空的也想知道它。
上下文:
可以从这里(http://ckeditor.com/download)下载CKEditorConfig,它是使用 map 实现的。但是您无法使用注入(inject)来设置此映射,因为未提供 setter 方法,并且没有提供构造函数来使用构造函数注入(inject)来设置它。但是,有五个 addConfigValue 方法(见下文),我可以使用它们来添加这些值。

public void addConfigValue(final String key, final Number value);
public void addConfigValue(final String key, final String value);
public void addConfigValue(final String key, final Boolean value);
public void addConfigValue(final String key, final Map<String, ? extends Object> value);
public void addConfigValue(final String key, final List<? extends Object> value);



我将在 j2ee/java Web 应用程序的几个地方使用 ckeditor,因此我认为应该创建一个工厂类,它返回通过某个名称初始化编辑器所需的设置。但我想外部化这些配置并将它们设置在 spring 上下文文件中。因此,由于我无法创建配置对象,我必须使用常规映射,然后使用映射构建配置对象。但我需要在构建对象之前验证来自 spring 的那些 map 。

这是我构建配置对象的方法:

    @SuppressWarnings("unchecked")
    public CKEditorConfig buildConfigFromMap(Map<String, Object> configMap) {
        CKEditorConfig config = new CKEditorConfig();
        for (String key : configMap.keySet()) {
            Object val = configMap.get(key);
            if (val instanceof Number)
                config.addConfigValue(key, (Number) val);
            else if (val instanceof String)
                config.addConfigValue(key, (String) val);
            else if (val instanceof Boolean)
                config.addConfigValue(key, (Boolean) val);
            else if (val instanceof List) {
                config.addConfigValue(key, (List<Object>) val);
            } else if (val instanceof Map) {
                // TODO
            }
            throw new IllegalArgumentException("invalid map value types");
        }
            return config;
    }

正如您所看到的,如果对象是映射,我需要能够验证其键是否是字符串。我知道我可以做这样的事情:

} else if (val instanceof Map) {
    for (Object mapKey : ((Map<Object, Object>) val).keySet()) {
    if (!(mapKey instanceof String))
        throw new IllegalArgumentException("invalid map value types");
    }
config.addConfigValue(key, (Map<String, Object>) val);
}

但是整个练习让我觉得我没有做正确的事情?有什么建议么?我愿意使用完全不同的方法。感谢您的意见。

最佳答案

这是不可能的,Java泛型在运行时就被删除了。 事实上它们只存在于编译器(和源代码)中。

您无法检查键和值的实际类型并从中推断出用于 Map 的泛型。

您只能在您控制的 map 源代码中推断泛型。

在我看来,你想强制 Spring 仅提供 Map。 这是一个解决方法:

public class StringKeyMapEntry { public String key; public Object value; }

注入(inject)List或StringKeyMapEntry[](不确定Spring是否可以做数组)并将其转换为Map

关于java - java.util.Map 键和值的运行时类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310632/

相关文章:

c - 输入 unsigned long long int 是否足够 1 - 10^9 范围?

java - Spring 启动: log file not generating

java - 我的代码中出现错误,但我不知道如何修复(Java fx stackPane)

java - look and feel (java swing) 是什么意思?

types - double float 是如何存储和计算的?

python - 在 Python 中,如何将字符串转换为文件?

java - Heroku App( Play )在本地工作正常,然后不保存到服务器上的数据库

java - 如何在 springboot 的 ConversionService 中 Autowiring

java - 在 Spring 表达式语言中访问属性文件

java - Spring Security - 为什么要为用户和角色设置单独的类?