ich eine Klasse, die wie folgt aussieht ...Kann nicht instanziiert den Typ T
public class LegionInputFormat
extends FileInputFormat<NullWritable, LegionRecord> {
@Override
public RecordReader<NullWritable, LegionRecord>
createRecordReader(InputSplit split, TaskAttemptContext context) {
/* Skipped code for getting recordDelimiterBytes */
return new LegionRecordReader(recordDelimiterBytes);
}
}
Ich möchte eine generische Art verwenden, so dass es jede Art von RecordReader durch den Benutzer, wie so angegeben zurückkehren konnten :
public class LegionInputFormat<T extends RecordReader<NullWritable, LegionRecord>>
extends FileInputFormat<NullWritable, LegionRecord> {
@Override
public RecordReader<NullWritable, LegionRecord>
createRecordReader(InputSplit split, TaskAttemptContext context) {
/* Skipped code for getting recordDelimiterBytes */
return new T(recordDelimiterBytes);
}
}
Wie der Post-Titel schon sagt, ich werde gesagt, dass ich „die Art T. nicht instanziiert“ Bei anderen Stack Exchange-Posts habe ich festgestellt, dass dies aufgrund der Funktionsweise von Generika nicht möglich ist. Was ich nicht erfassen konnte, ist eine intuitive Erklärung, warum das der Fall ist. Ich lerne am besten durch Verstehen, so dass es wirklich hilfreich wäre, wenn jemand es anbieten könnte.
Ich bin auch an der Best Practice interessiert, um das zu erreichen, was ich hier machen möchte. Sollte der Konstruktor für LegionInputFormat
eine Klasse RecordReader
akzeptieren, diese speichern und später darauf verweisen, um eine neue Instanz zu erstellen? Oder gibt es eine bessere Lösung?
(Zusätzliche Hintergrund -.. Kontext ist hier Hadoop, aber ich bezweifle es wichtig ist, ich bin ein ziemlich erreicht Daten Wissenschaftler, aber ich bin ziemlich neu in Java)
[Typ Erasure] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html). –
Ich bin mir nicht sicher, warum das das verhindert? Also wird zur Kompilierzeit 'T' durch' LegionRecordReader' oder irgendeine andere 'RecordReader'-Klasse ersetzt, die ich spezifiziere ... Warum verhindert das, dass' neues T zurückgeben 'zu Kompilierzeit 'neues LegionRecordReader' zurückgibt? –
Zur Kompilierzeit wird 'T' durch' java.lang.Object' ersetzt. ** Nicht ** 'LegionRecordReader'. –