Проблема переопределения метода добавления ArrayList - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть класс, который расширяет Java ArrayList. В настоящее время я использую Java build 1.6.0_22-b04. Выглядит так:

public class TokenSequence extends ArrayList<Token>{
    public TokenSequence (Collection<Token> tokens) {
        super(tokens);  
    }

   public void add(Object o) {
       if (o instanceof Token){ 
           add( (Token)o );
   }
   else if (o instanceof TokenSequence)
       add( (TokenSequence)o );
   else
      add( new Token( o.toString() ) );
   }

}

Моя проблема в вышеприведенном коде - метод add (Object o). Java не позволит мне скомпилировать код, потому что он говорит

"Name clash: The method add(Object) of type TokenSequence has the same erasure as add(E) of type ArrayList<E> but does not override it"

Этот же код без проблем работает на другом компьютере под сборкой Java 1.6.0_17-b04.

У кого-нибудь есть идеи по поводу быстрого исправления?

Ответы [ 7 ]

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

Попробуйте добавить аннотацию @Override к вашему методу add () и убедитесь, что у вас одинаковая подпись (логический тип возврата)

public class TokenSequence extends ArrayList<Object> {
  @Override
  public boolean add(Object e) {
    return super.add(e);
  }
}

Или, если вы хотите, чтобы она была недействительной, выберите другой метод.

ура

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

Измените его на public boolean add(Token o).(Обратите внимание, возвращаемый тип и тип параметра)

Чтобы переопределить метод, ваше переопределение должно иметь точно такую ​​же сигнатуру, включая тип возвращаемого значения.
Поскольку ваш метод имеет другой тип возвращаемого значения, он нефактически переопределяет базовый add метод.

Причина, по которой он даже не скомпилируется, состоит в том, что, поскольку он не переопределяет базовый метод, вы получаете два разных метода add, оба из которыхмогут вызываться вашим производным классом.
Однако из-за стирания типа они оба на самом деле принимают параметр Object, что недопустимо.

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

Абсолютно - используйте аннотацию @Override и в идеале используйте строго типизированную подпись:

@Override
public void add(Token token) {
    ...
}
0 голосов
/ 27 февраля 2019

создайте собственный класс ArrayList и переопределите метод add следующим образом

public class CustomArrayList<E> extends ArrayList<E>{

    @Override
    public boolean add(E e) {
        String temp = (String)e;
        if(temp==null || temp.isEmpty()){
            return false;
        }

        return super.add(e);
    }
}

с этим классом, следующий пример добавит только 1 элемент и размер печати как 1

public static void main(String args[]) {
        ArrayList<String> lst = new CustomArrayList<String>();
        lst.add("aaaa");
        lst.add(null);
        lst.add("");
        System.out.println(lst.size());
    }
0 голосов
/ 16 ноября 2010

Прежде всего, в текущей реализации будет идти бесконечная рекурсия, когда вы попытаетесь вызвать функцию add с экземпляром TokenSequence.Вы хотели вызвать addAll в этом случае?

Во-вторых, забудьте о

void add(Object)

, если вам нужно добавить 2 метода (заставьте их возвращать логическое значение, если вы хотитебыть последовательным):

public void add(String o) {
  add(new Token(o.toString()));
}

public void add(TokenSequence t){
  addAll(t);
}

, а добавление (Token) уже реализовано ArrayList

, с другой стороны, если вам нужен единственный метод, вы можете объявить, например:

public void add(Serializable t)

этот метод будет вызываться как для TokenSequence, так и для String.к сожалению, чтобы тот же метод выполнялся для токена (в отличие от метода, предоставленного ArrayList), вам потребуется:

  1. убедиться, что Token реализует Serializable
  2. приведение токена к сериализуемому

т.е.:

add((Serializable)new Token())
0 голосов
/ 16 ноября 2010

В сообщении об ошибке уже указана большая подсказка.

Я не пробовал, но я считаю, что правильная реализация будет:

public void add(Token o) {
}

потому что Token - это E в вашем выражении extends.

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

Вам нужно сделать:

 public boolean add(Token o) {
   }

Поскольку ArrayList является универсальным.

...