2012-06-01 7 views
2

Я закончил обучение Generics, и мне это не показалось легким. Однако я все понял. Вот что я понял. Я хочу, чтобы вы исправили меня, где я ошибаюсь, и ответьте на несколько вопросов :).Java Generics, Связанный список

public class LinkedList<T> { 
//class definition 
} 

  • Это означает, что LinkedList <> это класс, который будет принимать объекты классов, а также интерфейсы.
  • public class LinkedList<T extends Object> { 
    //class definition 
    } 
    

  • Это означает, что LinkedList <> это класс, который будет принимать объекты этих классов только, которые расширяют класс Object. В принципе, все классы. В случае сырого типа, Т будет заменен Object
  • public class LinkedList<T extends Object & java.lang.Serializable> { 
    //class definition 
    } 
    

  • Это означает, что LinkedList <> это класс, который принимает объекты всех тех классов, которые реализуют интерфейс Serializable. Если в список должен быть включен объект пользовательского класса, то определяемый пользователем класс должен реализовать Serializable.
  • public class LinkedList<T> implements Iterable<T> { 
    //class definition 
    } 
    

  • Это означает, что LinkedList <> класс может быть использован с коллекцией основой для цикла. Он должен перегружать итератор() метод, и должен иметь внутренний класс, который реализует Itarator<T> и перегружает hasNext(), следующий() и удалить()

  • Вопросы
    1. Пожалуйста, объясните смысл этого в простых словах и пример, если это возможно:
    общественный класс BinaryTree<T extends Comparable<? super T>> Что заменяет? 2. Я хочу написать выше упомянутый LinkedList <> класс в файл с помощью метода writeObject(). поэтому я заявляю, что это

    public class LinkedList<T extends Object> implements Serializable { 
        //methods and data members  
    private class Node implements Serializable { //inner class 
            T object; 
            Node next; 
          } 
        } 
    

    Должен ли внутренний класс внедрять Serializable?

    ответ

    2

    О своих первых четырех пунктов:

    1. списка, который должен содержать экземпляры T (в том числе классов, расширяющих T).
    2. Фактически идентичный первому, поскольку все классы расширяются Object.
    3. список, который может содержать только объекты, которые являются Serializable (таким же, как class LinkedList<T extends Serializable> { ... })
    4. итератора списка T, так что да, он может быть использован в расширенных петлях.

    Стоит отметить, что когда мы говорим «список, который может содержать только объекты указанного типа», мы должны сказать «should» вместо «can». Если вы не пройдете Class<?> объектов вокруг, Java (runtime) не будет проверять переданные значения в действительности, только компилятор будет и только на основе видимого статического типа, который можно было бы вручную изменить (чтобы выпустить предупреждение) ,

    О вопросы:

    1. Он представляет собой BinaryTree, который содержит объекты, которые Comparable к любому объекту одного и того же класса, как T или любого из его супертипов (Object это один супертипом всех классов, по существу, все классы что T распространяется и все интерфейсы, которые он реализует).
    2. Если вы хотите сериализовать объект, используя writeObject, то все экземпляры экземпляров, не являющихся переходными (то есть вы не можете перестроить на основе других данных), должны быть также Serializable или writeObject will ignore them. Выделение кода недостаточно для того, чтобы определить, должно ли Node быть Serializable или нет, но, вероятно, необходимо дать общее представление о примере List.
    +0

    Какой еще код необходим? –

    +0

    @FasihKhatib Индикация того, имеет ли 'LinkedList' нестатическое поле типа' Node'. – Romain

    +0

    Я планировал добавить нестатический метод 'public void writeIt()', который создавал бы 'ObjectOutputStream', а затем использовал' writeObject (this) ' –

    0

    От принципов Oracle:

    Примечание - Сериализация внутренних классов (то есть, вложенных классов, которые не являются статическими классы членов), включая местные и анонимные классы, настоятельно не рекомендуется по нескольким причинам. Поскольку внутренние классы, объявленные в нестатических контекстах, содержат неявные непереходные ссылки на включение экземпляров класса, сериализация такого внутреннего экземпляра класса приведет к сериализации связанного с ним экземпляра внешнего класса. Синтетические поля, созданные javac (или другими компиляторами JavaTM) для реализации внутренних классов, зависят от реализации и могут различаться между компиляторами; различия в таких полях могут нарушить совместимость, а также привести к конфликтующим значениям serialVersionUID по умолчанию. Имена, назначенные локальным и анонимным внутренним классам, также зависят от реализации и могут различаться между компиляторами. Поскольку внутренние классы не могут объявлять статические члены, кроме полей постоянной времени компиляции, они не могут использовать механизм serialPersistentFields для обозначения сериализуемых полей. Наконец, поскольку внутренние классы, связанные с внешними экземплярами, не имеют конструкторов с нулевым аргументом (конструкторы таких внутренних классов неявно принимают включенный экземпляр в качестве предварительного параметра), они не могут реализовать Externalizable. Однако ни одна из перечисленных выше проблем не относится к статическим классам-членам.

    Serializible Interface, Defining Serializable Fields for a Class

    1

    Чтобы добавить некоторые пояснения:

    T стенды для любого ссылочного типа; это может быть класс, или интерфейс, или массив, или он может быть параметризованным типом. Там нет никакого различия между классами и интерфейсами и т.д.

    T extends Object таким же, как T, потому что каждый ссылочный типом является подтипом Object (да, интерфейсы подтипы Object тоже). extends Object является своего рода избыточным.

    T extends Object & Serializable требует, чтобы T был подтипом как Object, так и Serializable. Поскольку, как мы уже говорили, все подтип Object, на данный момент вы можете считать его таким же, как T extends Serializable (он немного отличается, потому что в первом случае стирание T будет Object, а во втором случае Serializable; не нужно беспокоиться об этом на данном этапе).

    Смежные вопросы