2013-11-26 5 views
1

C/C++에서 매크로와 비슷한 것을 만들 수있는 간단한 클래스를 만들려고합니다. 기본적으로 나는과 같이, 객체의 목록 불구하고 몇 가지 작업을 수행해야 할 때 다음과 같은 코드를 호출 할 수 있도록하려면 : 나는 꽤 자바 프로그래밍하지 않은Java의 일반 추상 클래스

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

을, 내가 할 수있는 내가 마지막 방법 있음을 입력 할 때까지

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); 
} 

내 코드가 오류를 얻을하지 않습니다 나는 추상적 인 액션 메소드를 추가하려고하면 'T는 내 코드에 어떤 문제가 있는지 파악. 메서드 헤더에서 abstract를 제거하라는 오류가 발생하고이를 변경하면 다른 오류 목록이 표시됩니다. 나는 근본적인 것을 여기에서 놓친 것처럼 느낀다. 아무도 눈부신 오류가 있습니까?

답변

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

당신이 일반적인 방법을 때와 같은 방법 서명에 정의 할 필요

protected abstract void action(T obj); 

해야한다 : 그리고이 경우

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

(하지 않는 한 여기에서) generic 매개 변수는 클래스 수준에서 정의됩니다.

private 수정자를 제거하고 protected으로 변경해야합니다. abstract은 메서드를 재정의해야 함을 나타내지 만 private은 하위 클래스에서 액세스 할 수 없음을 나타냅니다. protected은 서브 클래스에 private의 액세스 가능성을 확장합니다. 대신

private abstract void action(<T> obj); 

+0

왜 내가 downvoted 되었습니까? 명확히 할 설명이 훨씬 도움이 될 것입니다. –

+0

Jeroen - 개인적인 추상 방법을 사용할 수 없기 때문에. (정의상) 서브 클래스가 그것을 덮어 쓰기 위해서는'protected' 또는'public' 또는'package'가 필요합니다. 나는이 줄'private abstract void action (T obj);'에 반대했다. –

+0

@ElliottFrisch : 바로 아래에 있습니다. 나는 처음에는 접근 자보다 잘못된 일반 할당에 집중했다. 나는 그것을 오해를 막기 위해 편집 할 것입니다. –

0

난 당신이 일반의 구문이 잘못

protected abstract void action(T obj); 

을 원한다고 생각, 당신은 개인 추상적 인 방법을 가질 수 없습니다.