2014-12-05 4 views
3

에 관련된 항목이 열거 형을 만듭니다 (? 관련)나는 모든과 같이, 하나 개의 추상 클래스를 확장 몇 가지 특정 클래스가 치죠 클래스

public abstract AbstractClass { 
    // abstract stuff here 
} 

public FirstSpecificClass extends AbstractClass { 
    // specific stuff here 
} 

public SecondSpecificClass extends AbstractClass { 
    // specific stuff here 
} 

내가 각 항목이 연결되어있는 다른 곳에 enum를 만들 필요를 특정 클래스 중 하나와; 이를 위해 생성자 매개 변수로 특정 클래스를 전달하고 열거 형 내에 개인 필드로 저장하고 있습니다 (해당 필드에 getter 메서드도 제공했습니다). 또한 특정 클래스 중 하나의 인스턴스를 인수로 사용하여 적절한 enum 요소 (또는 null)를 반환하는 정적 메서드를 만들어야합니다. 각 열거 형 엔트리를 반복하고 앞에서 언급 한 비공개 필드에 대한 getter와 함께 instanceof을 사용하여이 작업을 수행합니다.

public enum Types { 
    FIRST(FirstSpecificClass.class), // line 2 
    SECOND(SecondSpecificClass.class); // line 3 

    private Class<AbstractClass> classType; 

    private Types(Class<AbstractClass> classType) { 
    this.classType = classType; 
    } 

    public Class<AbstractClass> getClassType() { 
    return this.classType; 
    } 

    public static Types fromTypeInstance(AbstractClass instance) { 
    for(Types t : Types.values()) 
     if(instance instanceof t.getClassType()) return t; // line 17 
    return null; 
    } 
} 

내가 나중에 instanceof 검사에 반환하고 사용할 수 있도록 필드로 클래스 형식을 저장하는 방법을 오해하는 것 : 이것은 내 시도이다.

  • (열거 라인 2) :이 코드는 여러 컴파일시에 오류가 발생되는 생성자 Types(Class<FirstSpecificClass>)는 정의되지
  • (열거 라인 3) : 생성자 Types(Class<SecondSpecificClass>)는 정의
  • (라인 인) 열거 형의 17 : 호환되지 않는 피연산자 유형 booleanClass<AbstractClass>

나는 보통 자바 프로그래머가 아니다, 나는 홍보를 할 수 있지만 내 제네릭의 이해와 instanceof는, 기껏해야 퍼지입니다 OOP의 개념에 대한 회사의 이해. 이러한 오류를 해결하고 원하는 효과를 얻으려면 어떻게해야합니까?

답변

5

Java에서 제네릭은 불변합니다. 즉, FirstSpecificClassAbstractClass 인 경우에도 Class<FirstSpecificClass>Class<AbstractClass>이 아닙니다.

위와 같은 와일드 카드로 하위 유형을 명시 적으로 허용하여이 문제를 해결할 수 있습니다. 필요한 경우 AbstractClass 형식 인수 앞에 ? extends을 추가하십시오.

private Class<? extends AbstractClass> classType; 

private Types(Class<? extends AbstractClass> classType) { 
    this.classType = classType; 
} 

public Class<? extends AbstractClass> getClassType() { 
    return this.classType; 
} 

또한, 당신은 instanceof 운영자의 소스 코드에 직접 유형을 지정해야합니다, 그래서 이것은 컴파일되지 않습니다 :

if(instance instanceof t.getClassType()) 

당신은 런타임 솔루션을 대신 Class object's isInstance method을 사용할 수 있습니다 :

if(t.getClassType().isInstance(instance)) 
+0

aha! 고맙습니다! 이렇게하면 생성자의 유형 비 호환성을 해결할 수 있습니다. 오른쪽 인자가 실제로 Class 객체가 아니기 때문에 여전히 'instanceof' 검사에서 오류가 발생합니다 (분명히 "유형"이어야 함). instanceof 수표를 얻기 위해 어떻게 적절하게 캐스팅합니까? –

+0

그리고 입력 한대로 해결했습니다. 고맙습니다! –

+0

나는 그 오류도 알아 차렸고, 나는 나의 대답을 업데이트했다. – rgettman