883 Stimmen

Wie erhalte ich eine Klasseninstanz des generischen Typs T?

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 ?

2 Stimmen

Versuchen Sie, diese Frage zu beantworten, ich denke, es ist ähnlich. stackoverflow.com/questions/1942644/

3 Stimmen

1 Stimmen

0voto

Madhu Tomy Punkte 502

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

0voto

Christine Punkte 5479

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.

-4voto

nikolai.serdiuk Punkte 702

Ich verwende eine Umgehungslösung für dieses Problem:

class MyClass extends Foo<T> {
....
}

MyClass myClassInstance = MyClass.class.newInstance();

CodeJaeger.com

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.

Powered by:

X