Ich habe eine generische Klasse, Foo<T>
. Bei einer Methode der Foo
Ich möchte die Klasseninstanz des Typs T
aber ich kann einfach nicht anrufen T.class
.
Was ist der bevorzugte Weg, um das Problem zu umgehen? T.class
?
Ich habe eine generische Klasse, Foo<T>
. Bei einer Methode der Foo
Ich möchte die Klasseninstanz des Typs T
aber ich kann einfach nicht anrufen T.class
.
Was ist der bevorzugte Weg, um das Problem zu umgehen? T.class
?
Ich wollte T.class an eine Methode übergeben, die die Generics verwendet
Die Methode readFile liest eine .csv-Datei, die durch den Dateinamen mit vollem Pfad angegeben wird. Es kann csv-Dateien mit unterschiedlichen Inhalten geben, daher muss ich die Modelldateiklasse übergeben, damit ich die entsprechenden Objekte erhalten kann. Da es sich um das Lesen von CSV-Dateien handelt, wollte ich dies auf eine generische Weise tun. Aus irgendeinem Grund oder andere keine der oben genannten Lösungen für mich gearbeitet. Ich muss verwenden Class<? extends T> type
damit es funktioniert. Ich verwende die opencsv-Bibliothek zum Parsen der CSV-Dateien.
private <T>List<T> readFile(String fileName, Class<? extends T> type) {
List<T> dataList = new ArrayList<T>();
try {
File file = new File(fileName);
Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
Reader headerReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
CSVReader csvReader = new CSVReader(headerReader);
// create csv bean reader
CsvToBean<T> csvToBean = new CsvToBeanBuilder(reader)
.withType(type)
.withIgnoreLeadingWhiteSpace(true)
.build();
dataList = csvToBean.parse();
}
catch (Exception ex) {
logger.error("Error: ", ex);
}
return dataList;
}
So wird die readFile-Methode aufgerufen
List<RigSurfaceCSV> rigSurfaceCSVDataList = readSurfaceFile(surfaceFileName, RigSurfaceCSV.class);
Ich nehme an, Sie haben in Ihrer Klasse ein Feld vom Typ T. Wenn es kein Feld vom Typ T gibt, was nützt dann ein generischer Typ? Sie können also einfach ein instanceof auf dieses Feld anwenden.
In meinem Fall habe ich eine
List<T> items;in meiner Klasse, und ich prüfe, ob der Klassentyp "Ort" ist, indem ich
if (items.get(0) instanceof Locality) ...
Dies funktioniert natürlich nur, wenn die Gesamtzahl der möglichen Klassen begrenzt ist.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
2 Stimmen
Versuchen Sie, diese Frage zu beantworten, ich denke, es ist ähnlich. stackoverflow.com/questions/1942644/
3 Stimmen
Mögliche Duplikate von Generischen Typ einer Klasse zur Laufzeit abrufen
1 Stimmen
Mögliche Duplikate von Instanziierung einer generischen Klasse in Java
2 Stimmen
import com.fasterxml.jackson.core.type.TypeReference;
new TypeReference<T>(){}
0 Stimmen
Ja, wie der obige Kommentar andeutet, habe ich das Problem durch die Bereitstellung von
new TypeReference<Foo<Bar>>() {}
als Parameter für meine deserialisierte Modelllesemethode.