问题重写ArrayList add方法

时间:2010-11-16 16:03:13

标签: java jdk1.6

我有一个扩展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 build 1.6.0_17-b04下的另一台计算机上没有问题。

任何人都对快速修复有什么想法?

7 个答案:

答案 0 :(得分:4)

尝试将@Override注释添加到add()方法,并确保具有相同的签名(布尔返回类型)

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

或者,如果您希望它无效,请采用另一种方法参数。

欢呼声

答案 1 :(得分:2)

将其更改为public boolean add(Token o)。 (注意返回和参数类型)

为了覆盖方法,您的覆盖必须具有完全相同的签名,包括返回类型 由于您的方法具有不同的返回类型,因此它实际上不会覆盖基本add方法。

它甚至不会编译的原因是因为它没有覆盖基本方法,所以最终会得到两个不同的add方法,这两个方法都可以由派生类调用。
但是,由于类型擦除,它们实际上都采用Object参数,这是非法的。

答案 2 :(得分:1)

绝对 - 使用@Override注释,理想情况下使用强类型签名:

@Override
public void add(Token token) {
    ...
}

答案 3 :(得分:0)

你需要这样做:

 public boolean add(Token o) {
   }

因为ArrayList是通用的。

答案 4 :(得分:0)

错误消息已经提供了一个很大的提示。

我没有尝试过,但我相信正确的实施方式是:

public void add(Token o) {
}

因为Token是您的extends语句中的E

答案 5 :(得分:0)

首先,在当前实现中,当您尝试使用TokenSequence实例调用add函数时,它将进入无限递归。在那种情况下你的意思是打电话给“addAll”吗?

其次,忘了

void add(Object)

在你的情况下,你需要添加2个方法(如果你想保持一致,让它们返回布尔值):

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

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

并且add(Token)已经由ArrayList实现

另一方面,如果你想要一个方法,你可以声明,例如:

public void add(Serializable t)

将为TokenSequence和String调用此方法。 不幸的是,为Token执行相同的方法(与ArrayList提供的方法相反),您将需要:

  1. 确保令牌实现Serializable
  2. 将令牌转换为可序列化
  3. 即:

    add((Serializable)new Token())
    

答案 6 :(得分:0)

创建一个自定义ArrayList类并重写添加方法,如下所示

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());
    }