如何指定字体属性的通用Map?

时间:2011-08-15 16:45:56

标签: java generics

我有这个方法,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书籍,但未找到答案。有人可以帮帮我吗?

3 个答案:

答案 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,你可以得到一切!