2011-09-27 2 views
2

나는 문제를 일반적인 열거를 정의하지만이 노력하고있어 :일반 열거 형을 만들 수 있습니까?

private enum Stick<T>{ 
    A, B, C; 

    private Stack<T> disks = new Stack(); 

    public void print(){ 
     System.out.println(this.name() + ": " + disks); 
    } 

    public T pop(){ 
     return disks.pop(); 
    } 

    public void push(T element){ 
     disks.push(element); 
    } 

}; 

은 가능한 모든 있습니까?

+2

왜 열거 형에 스택을 넣으시겠습니까? –

+0

왜 사람들은 주제와 관련이없는 질문을하는 경향이 있습니까? – damluar

+3

이므로 주제와 관련되어 있습니다. – Bozho

답변

11

열거 형은 상수입니다. 따라서 Stack disks은 "열거 형 클라이언트가 원하는 모든 유형의 스택"이 될 수 없습니다. 고정식이어야합니다.

열거 형에 필드가있는 요점은 각 요소에 대한 추가 정보를 보유 할 수 있어야한다는 것입니다. 예를 들어 스택의 경우 A("a", "b"), B("b", "c", "d") 일 수 있습니다. 각 요소는 스택에로드 할 항목을 지정합니다 (이 예에서는 varargs 생성자가 필요함). 그러나 그들의 유형은 정확하게 지정되어 있습니다. <T> 일 수 없습니다.

이클립스 컴파일러가 표시되는지 오류는 분명하다 :

구문 오류, 열거 선언 할 수 없습니다 유형 매개 변수

그러나

, 당신은 같은 것을 수행 할 수 있습니다

enum Foo { 
    A("foo", "bar"), 
    B(0, 1, 2); 
    private Stack<?> stack; 
    private <T> Foo(T... args) { 
     stack = new Stack<T>(); 
     stack.addAll(Arrays.asList(args)); 
    } 
    public <T> Stack<T> getStack() { 
     return (Stack<T>) stack; 
    } 
} 

다음 :

Stack<String> stack1 = Foo.A.getStack(); 
Stack<Integer> stack2 = Foo.B.getStack(); 

System.out.println(stack1); 
System.out.println(stack2); 
에 5,

결과 :

[foo, bar] 
[0, 1, 2] 

업데이트 : 이후 목표에 대한 의견 - 그 값이 변경되기 때문에 하노이 타워, 열거해서는 안됩니다. 대신 값이 스택 인 Map에 대한 키로 열거 형을 사용해야합니다. 열거 형 필드를 사용하여 유혹하는 것처럼 보이지만 좋은 습관은 아닙니다. Enum은 상수가 좋습니다. 물론 위의 예를 통해 목표를 달성 할 수 있지만 Map을 권하고 싶습니다.

+0

감사합니다. 나는 enum이 일정하다고 생각한다. 그러나 기술적으로 말하자면 고정 된 수의 인스턴스와 동일한 클래스입니다. 따라서 제네릭을 사용할 수 있어야합니다. – damluar

+0

@damular 그리고 'T'는 어떤 유형이어야합니까? 'new' 연산자를 사용하여 열거 형을 생성 할 수 없으므로'T' 유형을 어떻게 정의합니까? – Thomas

+0

@damluar 왜 스틱을 원하니? 스택? 열거 형 상수가 될까요? – entonio

0

아니요. 그러나 Enums는 인터페이스를 구현할 수 있습니다. 도움이 될 수 있습니다.

0

help 일 수 있습니다. 기본적으로, 당신이 필요합니다

public interface Stick<E extends Enum<E>> 
관련 문제