0

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

有人对快速修复有任何想法吗?

4

7 回答 7

5

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

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

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

干杯

于 2010-11-16T16:06:34.740 回答
2

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

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

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

于 2010-11-16T16:04:54.987 回答
1

绝对 - 使用@Override注释,最好使用强类型签名:

@Override
public void add(Token token) {
    ...
}
于 2010-11-16T16:05:02.807 回答
0

你需要做:

 public boolean add(Token o) {
   }

因为 ArrayList 是泛型的。

于 2010-11-16T16:04:57.860 回答
0

错误消息已经在这里提供了很大的提示。

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

public void add(Token o) {
}

因为TokenE您的 extends 语句中。

于 2010-11-16T16:05:32.807 回答
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. 确保 Token 实现 Serializable
  2. 将 Token 转换为可序列化

IE:

add((Serializable)new Token())
于 2010-11-16T17:23:49.117 回答
0

创建一个自定义 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());
    }
于 2019-02-27T20:33:26.807 回答