You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:55:01