如何向java.awt.Font.getAttributes()返回的Map<TextAttribute, ?>中插入元素?
关于java.awt.Font.getAttributes()返回Map<TextAttribute, ?>的插入问题
首先明确:java.awt.Font.getAttributes()返回的Map<TextAttribute, ?>,从设计逻辑上就不是给你直接修改的。
这种带无界通配符的返回类型,本质是编译器层面的防护——因为值类型是?,你无法直接向其中插入非null元素,这就是在明确暗示:这个Map是只读的。而且实际上,它大概率是一个不可修改的视图(比如用Collections.unmodifiableMap包装的实例),就算你强行通过类型转换绕过编译器检查,运行时也会抛出UnsupportedOperationException。
那要修改字体属性该怎么做?正确姿势是复制出一个可修改的Map:
- 把返回的只读Map复制到具体类型的可修改Map中(比如
HashMap<TextAttribute, Object>) - 在这个新Map里完成插入、修改操作
- 最后用
Font.deriveFont(Map<TextAttribute, ?>)方法生成新的Font对象
实际代码示例:
// 原字体实例 Font originalFont = new Font("Arial", Font.PLAIN, 12); // 获取只读属性Map Map<TextAttribute, ?> readOnlyAttrs = originalFont.getAttributes(); // 复制为可修改的Map Map<TextAttribute, Object> mutableAttrs = new HashMap<>(readOnlyAttrs); // 插入新属性,比如添加下划线 mutableAttrs.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); // 或修改现有属性,比如调整字号 mutableAttrs.put(TextAttribute.SIZE, 16); // 基于修改后的属性创建新字体 Font modifiedFont = originalFont.deriveFont(mutableAttrs);
这种方式既符合Java标准库的设计意图,又能安全完成属性修改,完全不需要不安全的强制类型转换。
内容的提问来源于stack exchange,提问作者davidalayachew
相关产品推荐
相关产品推荐

