Использование обобщений в Java-коде Android - PullRequest
4 голосов
/ 28 сентября 2010

Я новичок в Java, поэтому не уверен, возможно ли это.В основном мне нужно десериализовать файл в объект заданного типа.В основном метод будет делать это:

FileInputStream fis = new FileInputStream(filename);
    ObjectInputStream in = new ObjectInputStream(fis);
    MyClass newObject = (MyClass)in.readObject();
    in.close();
    return newObject;

Я бы хотел, чтобы этот метод был универсальным, поэтому я могу сказать ему, к какому типу я хочу in.readObject() преобразовать свой вывод и вернуть его.*

Надеюсь, что это имеет смысл ... но опять же, я, вероятно, неправильно понял дженерики, и на самом деле это невозможно или нежелательно.

Спасибо, Д.

Ответы [ 2 ]

7 голосов
/ 28 сентября 2010

Я не уверен насчет Android (или его ограничений), но в Java вы можете сделать что-то вроде этого:

public static <T> T getObject(String filename) throws IOException, ClassNotFoundException {
    FileInputStream fis = new FileInputStream(filename);
    ObjectInputStream in = new ObjectInputStream(fis);
    T newObject = (T) in.readObject();
    in.close();
    return newObject;
}

и затем назвать его как

MyClass myObj = getObject("in.txt");

Это даст вам неконтролируемое предупреждение о приведении, поскольку компилятор не может быть уверен, что вы можете привести полученный объект к указанному типу, поэтому он не совсем безопасен для типа.Вы должны быть уверены, что то, что вы получаете из входного потока, на самом деле может быть приведено к этому классу, иначе вы получите ClassCastException.Вы можете подавить предупреждение, пометив метод с помощью @SuppressWarnings("unchecked")

1 голос
/ 28 сентября 2010

Только что увидев это Как сделать метод, возвращающий тип, универсальным? Я собираюсь попробовать следующее:

public <T> T deserialiseObject(String filename, Class<T> type)
            throws StreamCorruptedException, IOException,
            ClassNotFoundException {
        FileInputStream fis = new FileInputStream(filename);
        ObjectInputStream in = new ObjectInputStream(fis);
        Object newObject = in.readObject();
        in.close();
        return type.cast(newObject);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...