font.gettextattributesMap错误:不兼容的类型:integer无法转换为cap#1

vd8tlhqk  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(413)

我正在尝试启用字体连字:

Map attrs = font.getAttributes();
attrs.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
font = font.deriveFont(attrs);

注意 Map 未进行类型检查,编译器将发出警告:

warning: [unchecked] unchecked call to put(K,V) as a member of the raw type Map

这很公平,但我该怎么解决呢? getAttributes 退货 Map<TextAttribute, ?> (包含任意类型的值)从而尝试以下操作:

Map<TextAttribute, ?> attrs = font.getAttributes();
attrs.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
font = font.deriveFont(attrs);

现在编译器发出一个错误:

error: incompatible types: Integer cannot be converted to CAP#1

所以第一个参数是typechecked,我不希望对第二个参数进行typecheck(我们使用的是 ? 毕竟在这里——任何事情都有可能发生,这就是这张Map的重点)。
有没有办法取悦编译器的排版员?请注意,我不能更改api,也许有一种方法可以说 I know what I am doing here ?

wixjitnu

wixjitnu1#

deriveFont() 将保留现有属性,因此您不必这样做 getAttributes 第一。
下面的代码片段显示了它。

Font font = new Font("Courier", Font.PLAIN,20);
System.out.println(font.getAttributes()); // Prints map of {family="Courier", weight=1.0*, width=1.0*, posture=0.0*, size=20.0, transform=null*, superscript=0*, tracking=0.0*[btx=null, ctx=null]}

HashMap<TextAttribute, Object> attrs = new HashMap<>();
attrs.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
font = font.deriveFont(attrs);
System.out.println(font.getAttributes()); //Prints map of map of {family="Courier", weight=1.0*, width=1.0*, posture=0.0*, size=20.0, transform=null*, superscript=0*, ligatures=1, tracking=0.0*[btx=null, ctx=null]}

理想情况下,如果希望客户机向集合添加条目,则该集合将不具有参数类型 ? .
但在这种情况下,如果出现这种情况,我能想到的最佳选择是强制转换返回类型并抑制警告,如下所示:

@SuppressWarnings({"unchecked"})
Map<TextAttribute, Object> attrs = (Map<TextAttribute, Object>) font.getAttributes();
attrs.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
font = font.deriveFont(attrs);

谢谢

相关问题