2016-01-04 6 views
0

Метод в JavaSparkContext.newAPIHadoopRDD принимает класс как параметр.Java - Как передать класс универсального типа методу

В Скале я был в состоянии использовать метод, как так:

sc.newAPIHadoopRDD(job.getConfiguration, 
     classOf[AvroKeyInputFormat[AvroFlumeEvent]], 
     classOf[AvroKey[AvroFlumeEvent]], 
     classOf[NullWritable]) 

Как я могу это сделать в Java?

Как передать класс AvroKeyInputFormat<AvroFlumeEvent> в метод.

Ближайший я получил:

 Class<AvroKeyInputFormat<AvroFlumeEvent>> inputFormatClass; 
     Class<AvroKey<AvroFlumeEvent>> keyClass; 

     JavaPairRDD<AvroKey<AvroFlumeEvent>, NullWritable> flumeEvents = sc.newAPIHadoopRDD(hadoopConf, 
       inputFormatClass, 
       keyClass, 
       NullWritable.class); 

Однако, теперь жалуется, что inputFormatClass не может быть инициализирован. Я думаю, что мне что-то не хватает ...

ответ

1

Переменные на Java - либо null, либо экземпляр. Ваша переменная inputFormatClass не является ни null, ни экземпляром, поэтому вы не можете ничего с ней сделать, пока вы ее не инициализируете. Вот о чем он жалуется.

Что касается прохождения класса, вы можете сделать:

Class<AvroKeyInputFormat> clazz = AvroKeyInputFormat.class 

Универсальные типы не сохраняются во время выполнения - они используются только для проверки. Вот почему у вас не может быть класса AvroKeyInputFormat<AvroFlumeEvent>

+0

@Sam_Sun благодарит ... на днях я узнаю, какие java-generics хороши для ... – hba

Смежные вопросы