2010-01-20 72 views
1

假设我想要写的函数,其将创建从一些指定类型T为String一个HashMap,例如从整数到字符串一个HashMap如下:问题,使用Java反射

HashMap<Integer, String> myHashMay = new HashMap<Integer, String>();

我想拥有的flexibilty指定类型T.所以我写一个函数:

void foo(Class<?> myClass) { 
    HashMap<myClass, String> myHashMay = new HashMap<myClass, String>(); 
    ....... 
} 

所以,如果我调用FOO(Integer.class),整数到字符串一个HashMap将创建在这个函数里面。显然上面的foo函数甚至没有编译。任何人都可以给我一些关于如何用给定的函数签名来正确编写这样一个函数的提示。

谢谢,

+1

我觉得强制要注意的是,如果你用反射实例化一个对象,那么在编译时就没有类型信息,所以你必须做一个未经检查的强制转换。换句话说,你不能用反射来实例化一个HashMap ,只是一个HashMap。 – 2010-01-21 00:17:54

回答

2
<T> void foo(Class<T> myClass) { 
    HashMap<T, String> myHashMay = new HashMap<T, String>(); 
    ... 
} 

编辑: 然而,方法与这样的签名似乎并不是非常有用的,因为T被仅用于类型在编译时检查。我可以想像,当它只能使用单一的场景:

<T> void foo(Class<T> myClass) { 
    HashMap<T, String> myHashMay = new HashMap<T, String>(); 
    ... 
    try { 
     T key = myClass.newInstance(); 
     myHashMay.put(key, "Value"); 
    } catch (Exception ex) { ... } 
    ... 
} 
1

该函数创建一个地图就像你正在尝试做的:

public <KeyType> Map<KeyType,String> createMapWithKeyType(Class<KeyType> keyType) 
{ 
    return new HashMap<KeyType, String>(); 
} 

注:注意马特B上的评论,他说得很好。

+0

谢谢你们的答案和评论。他们非常有帮助。由于我使用的是第三方代码,为了让我的代码正常工作,我必须采用这种方法。 – RecSys2009 2010-01-22 15:10:00