我有这个方法,jdk1.6抱怨(没有错误只是警告)关于泛型类型参数化没有在Map和...中使用:
public static Font getStrikethroughFont(String name, int properties, int size)
{
Font font = new Font(name, properties, size);
Map attributes = font.getAttributes();
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
Font newFont = new Font(attributes);
return newFont;
}
然后我改为:
public static Font getStrikethroughFont2(String name, int properties, int size)
{
Font font = new Font(name, properties, size);
Map<TextAttribute, ?> attributes = font.getAttributes();
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
Font newFont = new Font(attributes);
return newFont;
}
但是
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
声明不再有效。
TextAttribute.STRIKETHROUGH_ON
是布尔值。
如何在上述方法中使用Generic Type功能?我查看了核心Java书籍,但未找到答案。有人可以帮帮我吗?
答案 0 :(得分:8)
您应该使用的是font.deriveFont(map)
。
public static Font getStrikethroughFont2(String name, int properties, int size)
{
Font font = new Font(name, properties, size);
Map<TextAttribute, Object> attributes = new HashMap<TextAttribute, Object>();
attributes.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
Font newFont = font.deriveFont(attributes);
return newFont;
}
这将解决您的泛型问题。派生字体将复制旧字体,然后应用您提供的属性。因此,它将使用Font
构造函数执行相同的操作。
答案 1 :(得分:5)
您不能在该地图中put
。它只是为了阅读。
您可以用来放置属性的地图是Map<String, Object>
如果您需要获取现有地图并创建包含其属性+其他属性的字体,请使用:
Map<TextAttribute, Object> map =
new HashMap<TextAttribute, Object>(font.getAttributes());
答案 2 :(得分:0)
我不确定我是否理解这个问题,但是如何做到这一点:
Map<TextAttribute, Object>
每个对象都有Object作为超类,你无论如何都不能在Map中放置任何原始类型。所以使用Object,你可以得到一切!