Как создать класс, который реализует java.util.collections - PullRequest
5 голосов
/ 29 ноября 2010

Я пытаюсь создать класс скажем MyStack, который бы реализовал класс java.util.collections.MyStack переопределит некоторые методы класса коллекций, такие как add (аналогично push), remove (аналогично pop) и т. Д. Я собираюсь смоделировать класс на тех же строках, что и Set или другие интерфейсы класса collectionза исключением того, что MyStack не будет интерфейсом или абстрактным классом и что мы можем создавать объекты типа MyStack.

У меня проблемы с синтаксисом, так как я не уверен, что я двигаюсь в правильном направлении. Пока у меня есть что-то вроде этого - ПРИМЕЧАНИЕ. - Ни один из методов до сих пор не определен - япытаясь получить скелет прямо перед тем, как приступить к определению методов.

import java.util.*;


public class MyStak implements java.util.Collection<E>{

    public boolean add(E o){

               return false;        
        }

       public boolean addAll(Collection c){
        return false; 

        }

       public void clear() {

       }

        public boolean contains(Object o){
          return false;

        }

        public boolean containsAll(Collection o){
          return false;

        }

        public boolean equals(Object c){
          return false; 
        }

        public int hashcode(){
          return 0; 
        }

        public boolean isEmpty(){
          return false; 
        }

        public Iterator iterator(){
          return null;

        }

        public boolean remove(Object o){
          return false; 
        }

        public boolean removeAll(Collection o){
          return false; 
        }

        public boolean retainAll(Collection o){
          return false; 
        }

        public int size(){
          return 1; 
        }

         public Object[] toArray(){
           return null;

         }

         public Object[] toArray(Object[] a){
           return null; 
         }

    }

У меня есть пара ошибок времени компиляции, таких как -

    +public class MyStak implements java.util.Collection<E>{
Multiple markers at this line
    - The type MyStak must implement the inherited abstract method 
     Collection<E>.add(E)
    - E cannot be resolved to a type

    +public boolean add(E o){
Multiple markers at this line
    - E cannot be resolved to a type
    - implements 
     java.util.Collection<E>.add

Любые модификации кода, примеры, исправления в моем коде, ссылки на учебные пособия и т. Д. Будут высоко оценены.

Ответы [ 6 ]

17 голосов
/ 29 ноября 2010

Не забудьте также указать <E> спецификацию для вашего класса:

public class MyStak<E> implements java.util.Collection<E>
                   ^^^

Если вы хотите облегчить себе жизнь, попробуйте подклассифицировать AbstractCollection вместо непосредственной реализации Collection. Он предоставляет разумные реализации по умолчанию для большинства методов, чтобы минимизировать объем кода, который вам нужно написать.

java.util

Класс AbstractCollection<E>

Этот класс предоставляет скелетную реализацию интерфейса Collection, чтобы минимизировать усилия, необходимые для реализации этого интерфейса.

Чтобы реализовать неизменяемую коллекцию, программисту нужно только расширить этот класс и предоставить реализации для методов iterator и size. (Итератор, возвращаемый методом iterator, должен реализовывать hasNext и next.)

Чтобы реализовать изменяемую коллекцию, программист должен дополнительно переопределить метод add этого класса (который в противном случае выдает UnsupportedOperationException), а итератор, возвращаемый методом iterator, должен дополнительно реализовать свой метод remove.

Программист должен, как правило, предоставлять конструктор void (без аргумента) и Collection согласно рекомендации в спецификации интерфейса Collection.

4 голосов
/ 29 ноября 2010

Вы были ОЧЕНЬ близки!

Вам также нужно определить E в вашем подклассе:

public class MyStak<E> implements java.util.Collection<E>

Идея состоит в том, что у вас может быть подкласс с, скажем, <E, F, G>, и вы реализуете два различных интерфейса, один с использованием E, другой с использованием F. Это или MyStak может быть специализированным и использовать определенный класс для * 1007. * вместо универсального E.

2 голосов
/ 29 ноября 2010

И еще одна рекомендация: если вы планируете реализовать собственный интерфейс коллекции, рассмотрите возможность расширения соответствующего абстрактного класса, но не реализуйте сам интерфейс, так как абстрактные классы реализуют общие методы интерфейса.Посмотрите на: AbstractCollection, AbstractSet, AbstractList

1 голос
/ 29 ноября 2010

Вместо:

public class MyStak implements java.util.Collection<E>{

попробуйте:

public class MyStak<E> implements java.util.Collection<E>{
0 голосов
/ 29 ноября 2010

Определение стека - это то, чего вы действительно хотите достичь?Если так, то продолжайте и определяйте его, даже не реализуя интерфейс Collection - это будет хорошо для простых случаевИли используйте существующий класс - java.util.Stack.

0 голосов
/ 29 ноября 2010

Когда мы реализуем Collection вместе с нами, мы также должны реализовывать Iterator<E>. Который используется для перебора элемента, на котором вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...