2013-11-26 58 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); 

为通用的语法是错误的,你不能有一个私人的抽象方法。