2013-07-12 90 views
0

我有以下的類結構。泛型忽略混淆

public abstract class X { } 
public class Y extends X { } 

我要做到以下幾點:

public abstract class Action { 
    public abstract <T extends X> void execute(T t); 
} 

public class SomeAction extends Action { 
    public void execute(Y y) { } 
} 

編譯器是給我以下錯誤:

The Type SomeAction must implement the inherited abstract method Action.execute(T)

我要覆蓋​​,但我想要的參數是X的一個子類。

我在這裏做錯了什麼?

回答

1

這聽起來像你想T extends X是延伸Action一個的類的屬性,而不是方法調用。你應該寫

public abstract class Action<T extends X> { 
    public abstract void execute(T t); 
} 

然後

public class SomeAction extends Action<Y> { 
    ... 
} 
+0

謝謝,它做到了:) – AM01

1
public <T extends X> void execute(T t); 

是一種抽象方法,因爲它沒有任何主體。它應該被標記爲抽象。

所以在你的子類,你需要重寫本或兩標記方法和子類的抽象。

+0

謝謝,我編輯了這個問題。我錯誤地忽略了這一點。 – AM01

2

嘗試使Action類通用的,而不是它的方法。

public abstract class Action<T extends X> 
{ 
    public abstract void execute(T t); 
} 

然後你可以指定泛型類型參數TYSomeAction

public class SomeAction extends Action<Y> 
{ 
    public void execute(Y y) {} 
} 
+0

謝謝,它做到了:) – AM01

1

你打破了Liskov的原則:基本動作的execute方法能夠執行任何種類的子類X的只是,你把它限制只執行Y實例。這是減少合同,而不是延長合同。

+0

基類X是抽象的。 – AM01

+1

那又如何?它仍然通過其公共方法來定義契約,所有的實現都必須遵守契約。 –

+1

Action類中的泛型方法涉及使用一個類型調用它並讓它返回相同的類型。這與重寫該方法無關。正如@JBNizet所解釋的,覆蓋必須與父代中方法的簽名匹配......包括它的通用方面。 –