2011-07-04 6 views
0

매개 변수로 클래스 유형을 전달하는 방법은 무엇입니까?클래스 유형 ('SomeClass.class')을 대체하기 위해 제네릭 형식 ('Object myVar')을 매개 변수로 전달하는 방법은 무엇입니까?

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; 
} 

나는 매개 변수 각각 mapperformat와 값 TestMapper.classDatastoreInputFormat.class를 교체합니다.

Object을 (를) TestMapper.class (으)로 변환하는 방법의 확실하지 않습니다.

답변

1

getConfig()의 매개 변수에는 Object 대신에 Class 유형이 있어야합니다. 그러나 :

Mapper와 Format 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가하는 것과 같은 개체를 반환합니다.

conf.setClass("mapreduce.map.class",(Class<?>)mapper, Mapper.class); 
conf.setClass("mapreduce.inputformat.class",(Class<?>)format,InputFormat.class); 
: 당신의 mapperparameter 이미의 .class 객체입니다

경우, conf.setClass을() 가정, 당신이 Class 객체에 객체를 다시 캐스팅 할 수 foo.getConfig(TestMapper.class,DatastoreInputFormat.class); 같은 방법 불렀다 즉 Class<?> 형식을 사용합니다

+0

그는 이미 그가 클래스로 파라미터를 받았다는 것을 의미한다고 생각합니다. 정말 분명하지 않지만 ... 아마 당신은 더 나은 의사를 이해했습니다. – AlexR

+0

그럴 수도 있습니다. 필요한 경우 캐스팅 만하면됩니다. – Lyke

0

Configuration.setClass()의 프로토 타입이 무엇인지 명확하지 않습니다. Configuration.setClass(String, Class, Class) 인 경우 캐스팅을 통해 Object에서 Class로 변환 할 수 있습니다 : (Class)mapper 및 (클래스) format`.

모든 주조로서 나쁜 스타일이지만 ... 왜 getConfig()가 Objects를 수신합니까? Class 클래스의 인수를 받아야합니까? 이 경우 전혀 캐스팅 할 필요가 없습니다.

관련 문제