2011-03-01 4 views
2

이 열거 형이 컴파일되지 않는 이유는 무엇입니까?이 열거 형이 컴파일되지 않는 이유는 무엇입니까?

public enum Ackr implements Cloneable{ 
    INSTANCE; 

    public <Ackr extends Cloneable> Ackr getInstance(){ 
     return INSTANCE; //Type mismatch: cannot convert from Ackr to Ackr 
//  return (Ackr)INSTANCE; //Type safety: Unchecked cast from Ackr to Ackr 
    } 
} 
+5

'public Ackr getInstance() {...}'의 문제점은 무엇입니까? 또는, 왜 그런 이유로'getInstance()'가 필요합니까? – skaffman

+0

열거 형을 복제 할 수 없습니다 ... 이것은 단지 의미가 없습니다. – maaartinus

답변

4

필자가 아는 한, 필연적 인 것은 아니다. 간단한 사용해보기

public Ackr getInstance(){ 
    return INSTANCE; 
} 
2

이 서명으로 무엇을 달성하려고합니까?

public <Ackr extends Cloneable> Ackr getInstance() ... 

그냥 쓸 수 없습니까?

public Ackr getInstance() ... 

는 또한 Clonable을 확장하는 enum 종류의 무의미하다고 생각합니다. enum은 복사 할 수 없습니다 ... 열거 형 값 중 하나만 존재합니다.

+0

나는 에 대한 이유가 없다고 생각하지만, 어떤 맥락에서이 구조가 타당한가? – oliholz

+0

제네릭에 대한 Java 자습서를 읽어야합니다. 그것은 그런 종류의 것을 설명하는 훨씬 더 좋은 일을 할 것입니다. –

2

제네릭에 대한 오해가 있습니다. 열거 형 클래스 Ackr<Ackr extends Cloneable 유형과 동일하지 않습니다.

public <Ackr extends Cloneable> Ackr getInstance()

당신은 위의 방법 선언과 함께 새로운 유형을 정의합니다. enum 클래스 Ackr과 완전히 다릅니다. 그래서 수업을 컴파일 할 수 없었습니다.

1

당신은 코멘트에 쓴 :

내가 거기에 이유가 <Ackr extends Cloneable>을위한 없지만, 어떤 맥락에서이 구조가 나을 거 같아?

이것은 메서드에 대한 형식 매개 변수입니다.

public <Ackr extends Cloneable> Ackr getInstance(){ ... } 

은 Cloneable을 확장하는 일부 유형의 객체 (호출자가 선택할 수 있음)를 반환하는 메소드를 정의합니다. 이 메소드는 합법적으로 null만을 반환 할 수 있습니다. 호출자가 어떤 유형으로 선택되었는지, null이 모든 참조 유형에서 유일한 값이므로) 예외를 throw하므로 실제로 유용하지 않습니다. 당신은 더 나은이처럼 작성합니다 있도록

여기 유형 매개 변수 Ackr는 같은 이름의 당신의 열거 클래스에 관련이 없습니다 :

public <A extends Cloneable> A getInstance(){ ... } 

유형의 같은 용도가 자바 API의 몇 가지 사례가있다 매개 변수는 반환 형식에서만 사용되지만 일부 매개 변수가있는 형식을 반환합니다. 메서드의 형식 매개 변수는 반환 형식의 형식 매개 변수로 사용됩니다. 예를 들어 Collections.emptySet()을 찾으십시오.

보다 자주 메서드의 매개 변수 유형이 메서드의 매개 변수 유형 (반환 유형에만 추가되거나 추가됨)에서 사용됩니다.

public <A> A getFirstElement(Iterable<A> list); 

이 방법은 몇 가지 유형 A의의 Iterable 소요되며,이 유형 A의 객체를 반환 (이름에서, 하나는이 반복자의 첫 번째 요소를 취한다고 가정한다.일반적으로

public <A> A getFirstElement(Iterable<A> list) { 
    Iterator<A> it = list.iterator(); 
    if(it.hasNext()) { 
     return it.next(); 
    } 
    return null; 
} 

:) 여기에 구현 한 것입니다 당신이 형식 매개 변수를 (어디서나)이있는 경우, 당신은 여기처럼 당신이 (일부 기존 유형과 같은 그 이름을 지정하지 있는지 확인하시기 바랍니다) -이 과 같은 이상한 오류 메시지로 인해 큰 혼란을 낳을 수 있습니다. Ackr은 Ackr에 할당 할 수 없습니다.

는 이유 유형 매개 변수는 종종 (맵의 키와 값 타입), T (일반 타입) 하나 (또는 ​​드물게 2 개) E (요소 형) 같은 캐릭터 이름, K, V을 가지고있다.

관련 문제