2010-11-16 48 views
0

我有一個擴展Java的ArrayList的類。我目前正在使用Java build 1.6.0_22-b04。看起來像這樣:問題重寫ArrayList添加方法

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。

任何人有任何想法快速解決?

+0

你確定你的代碼不能編譯? – 2010-11-16 16:11:11

+0

@org:他可能會將警告設置爲錯誤。 – SLaks 2010-11-16 16:11:48

+0

@SLaks標準javac甚至不會警告 – 2010-11-16 16:15:06

回答

2

將其更改爲public boolean add(Token o)。 (注意返回和參數類型)

爲了覆蓋方法,您的覆蓋必須具有完全相同的簽名,包括返回類型。
由於您的方法具有不同的返回類型,因此它實際上並不會覆蓋基本方法add

它甚至不會編譯的原因是因爲它沒有覆蓋基本方法,所以最終得到兩個不同的add方法,這兩個方法都可以由您的派生類調用。
但是,由於類型擦除,他們實際上都採取Object參數,這是非法的。

+1

。 – 2010-11-16 16:10:50

0

你需要做的:

public boolean add(Token o) { 
    } 

因爲ArrayList的是一個通用的。

1

絕對 - 使用@Override註釋,最好使用強類型的簽名:

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

返回類型應該是'boolean' – 2010-11-16 16:09:19

0

錯誤消息已經在這裏提供了大量線索。

我還沒有嘗試過,但我相信正確的實現將是:

public void add(Token o) { 
} 

因爲Token是在你的擴展語句E

4

嘗試添加@Override批註到您的add()方法,並確保具有相同的簽名(布爾返回類型)

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

或者,如果你希望它是無效的,採取另一種方法PARAM。

歡呼

0

首先,在當前的實現將進入無限循環時,你會嘗試調用添加函數TokenSequence的實例。你是否打算在這種情況下調用「addAll」?

二,忘掉

void add(Object) 

在你情況下,你需要添加2種方法(讓他們返回boolean值,如果你想成爲一致):

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

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

和附加(令牌)已經由ArrayList執行

另一方面,如果你想單一的方法,你可以聲明,例如:

public void add(Serializable t) 

將爲TokenSequence和String調用此方法。 不幸使令牌執行同樣的方法(如反對通過ArrayList中提供的一個),你將需要:

  1. 確保令牌實現Serializable
  2. 投令牌爲序列

即:

add((Serializable)new Token())