如何将泛型类型('Object myVar')作为参数传递来替换类类型('SomeClass.class')?

时间:2011-07-04 20:00:09

标签: java

如何将类类型作为参数传递?

public Configuration getConfig(Object mapper, Object format) {
    Configuration conf = new Configuration(false);
    conf.setClass("mapreduce.map.class", TestMapper.class, Mapper.class);
    conf.setClass("mapreduce.inputformat.class", DatastoreInputFormat.class, InputFormat.class);
    return conf;
}

我想分别用参数TestMapper.classDatastoreInputFormat.class替换值mapperformat

我不确定如何从Object转换为TestMapper.class

2 个答案:

答案 0 :(得分:1)

getConfig()的参数应该首先包含Class类型而不是Object。但是:

如果您想要任何映射器和格式对象的运行时类,只需调用它们的.getClass()方法即可。

 conf.setClass("mapreduce.map.class",mapper.getClass(), Mapper.class);
 conf.setClass("mapreduce.inputformat.class",format.getClass(),InputFormat.class);

因此,如果您的mapper方法参数实际上是TestMapper的一个实例,则mapper.getClass()将返回与TestMapper.class相同的对象。

如果您的mapperparameter已经是.class对象,即您已将方法调用为foo.getConfig(TestMapper.class,DatastoreInputFormat.class);,则可以将对象强制转换为Class对象,假设为conf。 setClass()接受Class<?>类型:

conf.setClass("mapreduce.map.class",(Class<?>)mapper, Mapper.class);
conf.setClass("mapreduce.inputformat.class",(Class<?>)format,InputFormat.class);

答案 1 :(得分:0)

不幸的是,目前还不清楚Configuration.setClass()的原型是什么。如果是Configuration.setClass(String, Class, Class),您可以通过强制转换从对象转换为类:(Class)mapper和(类)格式`。

虽然这是一个糟糕的风格,因为所有的铸造...为什么getConfig()接收对象?可能它应该接收类型Class的参数?在这种情况下,您甚至根本不需要任何铸造。