2013-11-26 86 views
1

我試圖做一個簡單的小類,我可以在C/C++中創建類似於宏的東西。基本上,我希望能夠調用下面的代碼,當我需要,雖然對象列表執行一些操作,例如:Java中的通用抽象類

new IteratableList{ 
    void action() { 
     // do something 
    } 
}.perform(); 

我還沒有在Java中在相當長的一段程序,我可以「噸弄清楚什麼是錯我的代碼,當我嘗試添加抽象操作方法:直到我鍵入最後一個方法

import java.util.List; 
import java.util.Iterator; 

public abstract class IteratableList<T> { 
    public void perfrom(List<T> ls) { 
     Iterator<T> l = ls.iterator(); 
     while (l.hasNext()) 
      action(l.next()); 
    } 

    private abstract void action(<T> obj); 
} 

我的代碼沒有得到任何錯誤。我得到的錯誤告訴我從方法頭中刪除抽象,當我更改時,我得到了其他錯誤的列表。我覺得我錯過了一個基本的東西。有沒有人看到明顯的錯誤?

回答

7
private abstract void action(<T> obj); 

應該

protected abstract void action(T obj); 

當你有一個通用的方法,你必須在方法簽名將其定義爲這樣的:

protected abstract <T> void action(T obj); 

除非(這是情況這裏)泛型參數是在類級別定義的。

您還應該刪除private修飾符,並將其修改爲protectedabstract表示該方法必須被覆蓋,但private表示子類無法訪問它。 protectedprivate的可訪問性擴展到子類。

+0

爲什麼我低調?澄清意見會更有幫助。 –

+0

Jeroen - 因爲你不能有一個私人的抽象方法。由於(根據定義)它必須是'protected'或'public'或'package'才能覆蓋子類。我反對這一行'私人抽象 void action(T obj);'。 –

+0

@ElliottFrisch:就在它下面。我首先關注錯誤的通用任務,而不是訪問者。我會編輯它以防止誤解。 –

0

而不是

private abstract void action(<T> obj); 

我想你想

protected abstract void action(T obj); 

爲通用的語法是錯誤的,你不能有一個私人的抽象方法。