Как изменить класс generi c, чтобы основной метод мог работать? - PullRequest
2 голосов
/ 09 апреля 2020

У меня есть этот метод в классе

 @Override
    public Optional<T> parse (String fileString, Class someClass) {

        File file = new File(fileString);

        Class smclass= new Class();
        try {
            smclass= (Class) getUnmarshaller().unmarshal(file);
        } catch (JAXBException  e) {
            e.printStackTrace();
        }
        return (Optional<T>) Optional.ofNullable(smclass);
    }

и метод main:

        XmlService xmlParser = XmlServiceImpl.getInstance();
        Optional<class> smclass= xmlParser.parse("File.xml", smclass.class);
        System.out.println(smclass);

Я хочу изменить метод класса, чтобы я мог вызывать разные классы в методе main, не только один, но я не знаю как. Например:

        XmlService xmlParser = XmlServiceImpl.getInstance();
        Optional<**class**> **class**= xmlParser.parse("xmlFile.xml", **class**.class);
        System.out.println(**class**);

1 Ответ

1 голос
/ 09 апреля 2020

Другое редактирование: удален параметр типа из метода EDIT (снова): если вам не нужно создавать экземпляр T (что, я считаю, вам не нужно), вы можете сделать то, что ниже. Если API не находится под вашим контролем, вам придется написать Class вместо Class<T> и привести.

    @Override
    public Optional<T> parse (String fileString, Class<T> someClass) {

        File file = new File(fileString);

        T t = null;
        try {
            t = (T) getUnmarshaller().unmarshal(file);
        } catch (JAXBException  e) {
            e.printStackTrace();
        }
        return (Optional<T>) Optional.ofNullable(t);
    }

Если вам нужен объект Class для того, чтобы unmarshaller мог Если вы знаете, какой объект создать, то единственный способ сделать это - с помощью отражения (такова природа класса Class. Кроме того, я почти уверен, что JAXB все равно использует отражение внутри себя, и все это небезопасно.

Кроме того, не похоже, что вы используете someClass, так что вы, вероятно, могли бы иметь метод только с первым параметром. Но поскольку вы переопределяете какой-либо метод в суперклассе, вам, возможно, придется просто попробовать что выше.

...