我有一个扩展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下的另一台计算机上没有问题。
任何人都对快速修复有什么想法?
答案 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提供的方法相反),您将需要:
即:
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());
}