2015-01-14 2 views
0

다이아몬드 연산자의 기본 동작은 무엇 :나는 다음과 같은 선언 뭔가를 본 기억이

private static Logger log = Logger.getLogger(<>.class);

장점은 실수로 서로에 대한 로거없이 클래스에 클래스에서 붙여 넣기 할 수 있었다 수업.

이제는 컴파일 할 수 없으므로 구문이 잘못되었습니다. 그렇다면 정확히 <> (ArrayList <>() 등이 아닌) 자체적으로 해결할 수 있습니까? 나는 법적 멋진 트릭과 웹에 그것을 보았다

  1. :에서 법적 구문입니다

    내 주장이 온다 :

    당신에게

    업데이트 감사드립니다.

  2. 필자와 동료가 모두 Java 7을 사용하여 IntelliJ에 붙여 넣었으며 제대로 컴파일되었습니다.

즉, 그 페이지로 다시 이동하게 될 검색을 찾을 수 없으며, 지금 컴파일 할 수 없습니다. 컴파일러 나 Java 스펙 지식을 가진 사람이 그것이 유효하고 기본값이 무엇인지 확실하게 말할 수 있기를 바라고 있습니다.

+1

아무 것도 아닙니다. 구문 상 올바르지 않습니다. –

+2

제가 아는 한, 는 결코 합법적이지 않습니다. 다이아몬드 연산자 (Java 7에서 소개)는 마지막 예제 ('new ArrayList <>()')에서와 같이 생성자 호출에 대한 제네릭 형식 매개 변수를 유추해야 함을 나타냅니다.(다이아몬드 연산자가 없다는 것은 원시 타입의 생성을 의미한다.) –

+0

일부 IDE는 해당 구문을 사용하여 유형을 숨길 수 있다고 생각하지만 여전히 실제로 존재 하는가? –

답변

3

자바 5와 6에서 제네릭 클래스 *의 새 인스턴스를 선언해야 할 때 다음 구문을 사용해야했습니다.

List<String> myList = new ArrayList<String>(); 

제네릭 선언시 유형 유추가 없었습니다.

Java 7의 출현으로 컴파일러는 형식 유추에 대한 트릭 또는 두 가지를 배웠습니다.

컴파일러 이 자바 7에서 동일한 결과를 생성합니다라고하고 있어요으로 다음 다이아몬드 연산자 <>를 사용하여 추론 할 수있는 경우까지 위의 코드와 같은 : 상황은 물론,

List<String> myList = new ArrayList<>(); 

있습니다 , 그것은 할 수 없다. 이것은 위의 링크 된 예제에서 빌린 것입니다. 당신은 실제로 그 방법에 구체적인 Class을 통과해야

private static Logger log = Logger.getLogger(<>.class); 

및 Java는 할 수있을 것되지 않은 : 당신이 여기있어 무엇

List<String> list = new ArrayList<>(); 
list.add("A"); 
// The following statement should fail since addAll expects 
// Collection<? extends String> 

list.addAll(new ArrayList<>()); 

이 잘못 코드 그 맥락에서 당신을 위해 그것을 추론합니다.

* : 일반적인 방법으로는 나쁘지는 않지만, Java 6을 사용하여 많은 개발을하지 않았습니다.