2012-11-14 3 views
1

현재 나는 내 수업을 테스트하기 위해 다음 코드를 가지고 ... 나는 다음과 같은 것 할 싶습니다하지만 문법적으로 잘못된 무엇자바의 JUnit 배열

@RunWith(Suite.class) 
@SuiteClasses({ MyClass.class, MyNewClass }) 
public class AllTests { 
    public static void suite() {   
    } 
} 

- 어떤 것 올바른 형식이 맞습니까? ...

Class<?>[] classArray = new Class<?>[] { 
     MyClass.class, MyNewClass.class 
    }; 

@RunWith(Suite.class) 
    @SuiteClasses(classArray ) 
    public class AllTests { 
     public static void suite() {   
     } 
    } 
+0

일반 제거를 시도하십시오. chrislhardin

답변

4

안타깝게도 할 수 없습니다. 주석은 컴파일 타임 상수를 취해야하므로 { MyClass.class, MyNewClass.class }을 사용해야합니다.

"SCJP 학습 가이드"에서 K.Sierra으로
+0

정답입니다. 그것은 배열 변수를 어떻게 선언했는지가 아닌 주석에 무엇을 공급하는지에 관한 것입니다. – pholser

1

:. 은 "(그래서, 인수, 변수를 포함한 형태를 돌려주는 등) 와일드 카드 참조 선언 에만 사용될 수 있음을 명심 그들은 할 수 없습니다 새 입력 된 컬렉션을 만들 때 형식 매개 변수로 사용할 수 있습니다. 참조는 추상 및 다형성 일 수 있지만 실제로 생성 된 개체는 특정 형식이어야합니다.

문제 : 개체 생성시 와일드 카드 표기법을 사용할 수 없습니다. 그래서 새로운 ArrayList()는 컴파일되지 않습니다.

편집 : @artbristol은 컴파일 타임 상수가 주석에 전달되는 또 다른 문제점을 지적했습니다. 이 스레드의 응답을 보면 도움이 될 것입니다. 그 중 하나는 ENUM을 해결 방법으로 제안합니다. How to use an array constant in an annotation

1

--- 업데이트 ---

문제는 주석에서 줄기 것으로 보인다. 주석에는 컴파일 타임 상수가 필요합니다. 즉, 배열을 재 할당 할 수있는 방식으로 클래스의 "배열"을 만들거나 주석이 달린 메서드가 액세스 할 수 있기 전에 수정하는 것은 불가능합니다.

분명함을 지적하기위한 artbristol에 대한 크레딧. 처음에는 잘못된 경로를 시작했는데, 이는 1.7 환경에서 배열이 컴파일 된 이유를 찾으려고 시도한 것입니다.

실제로 Annotations는 선언적을 통해 Java 프로그래밍을 확장하려는 의미로 사용될 때 주석에 대한 컴파일 시간 상수 제한은 완벽합니다. 대신 와일드 카드를 시도하는 모든 Object에서 상속하기 위해 (때문에)

는,

Class<Object>[] classArray = new Class<Object>[] { .... }; 

그것은 반 패배 제네릭의 목적을 사용

--- 원래의 게시물 ---; 그러나, 그것은 당신이 필요로하는 "그것으로 무엇이든 쑤셔 넣으십시오"요구 조건을 만족시킬 것입니다.