通常,我会称其为错误,但这是在 Java 标准库中。
java.awt.Font.getAttributes()
返回一个 Map<TextAttribute, ?>
。
现在,这让我陷入了困境,因为我不知道如何将元素插入到这张地图中。毕竟,我们要插入的值的参数化类型是 ?,那么我们如何插入呢?
如果它正在获取,我会简单地存储我进入的任何内容
Object
,因为这是一个包罗万象的东西,就像无界通配符“?”一样是。
但是这是插入。除非我进行不安全的转换,否则如何插入?
我自己找到了答案——你不能。
这实际上是我滥用 API 的线索。在我看来,API 并不是很明显。但长话短说,有一个构造函数 接受 a
Map<TextAttribute, ?>
。这意味着我们提供我们自己的Map
供他们使用。现在,Map<TextAttribute, Object>
绝对可以适合Map<TextAttribute, ?>
,所以这意味着我们可以很好地提供一个值来传递给这个构造函数。
如果目标是查看
Map
的内容是什么,以便我们可以构造/填充我们自己的,只需将每个对象提取到 Object
或 var
中,然后进行一些 instanceof
检查以看看它是什么。从那里,您可以构建正确的类型 V
来放置您的 Map<K, V>
。
这是一个简单的代码示例,可以更清楚地解释这一点。
我想将
TextAttribute
插入 java.awt.Font
。
final Map<TextAttribute, Object> map = new HashMap<>(); //Empty map to hold ALL attributes
map.putAll(someFont.getAttributes()); //These are the pre-existing attributes on my font
map.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); //Adding an attribute
final Font font = Font.getFont(map); //Create font that has the new attribute + old ones too