如何插入地图<K, ?>?

问题描述 投票:0回答:1

通常,我会称其为错误,但这是在 Java 标准库中。

有一个方法 --

java.awt.Font.getAttributes()
返回一个
Map<TextAttribute, ?>

现在,这让我陷入了困境,因为我不知道如何将元素插入到这张地图中。毕竟,我们要插入的值的参数化类型是 ?,那么我们如何插入呢?

如果它正在获取,我会简单地存储我进入的任何内容

Object
,因为这是一个包罗万象的东西,就像无界通配符“?”一样是。

但是这是插入。除非我进行不安全的转换,否则如何插入?

java generics collections awt unbounded-wildcard
1个回答
0
投票

我自己找到了答案——你不能。

这实际上是我滥用 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
© www.soinside.com 2019 - 2024. All rights reserved.