2013-10-25 3 views
1

공식 Java JDK1.7 가이드에서이 인용문을 얻었지만 어떻게 작동하는지 이해할 수 없습니다. 아무도 설명 할 수 있을까요? 즉, 다이아몬드가 빈 문자열을 전달할 때 어떻게 다이아몬드가 정수 유형을 추정합니까? 이 예에서 이 다이아몬드 표기법에 대한 설명?

MyClass<Integer> myObject = new MyClass<>(""); 

는, 컴파일러는 일반 MyClass 클래스의, 공식 형식 매개 변수, X의 형 정수를 유추합니다. 형식을 유추합니다. 일반 클래스의 생성자의 형식 형식 매개 변수 T에 대한 문자열입니다.

답변

1

인용문은 클래스에 제네릭 생성자가 있음을 나타냅니다.이 생성자는 자체 형식 매개 변수를 선언합니다. 이는 일반적인 방법을 만드는 방법과 유사합니다. 생성자의 type 매개 변수는 클래스를 인스턴스화하는 동안 전달하는 인수에서 유추됩니다. 여기

가 호출 일치하는 클래스의 간단한 버전입니다 : 당신은 당신의 코드로 클래스를 인스턴스화 할 때 지금

class MyClass<T> { 
    <S> MyClass(S arg) { 
     System.out.println(arg); 
    } 
} 

를, 형식 매개 변수 TInteger으로 추론하고, 유형 매개 변수 S 생성자에 전달한 인수에서 String으로 추정됩니다.

다이아몬드 연산자의 경우 Java 7 이상에서는 참조에 대한 참조를 이미 할당 한 경우 일반 클래스의 인스턴스를 만드는 동안 형식 인수를 제공 할 필요가 없습니다. 형식 인수는 참조 형식 (여기서는 Integer)과 함께 사용됩니다.

+0

나는 MyClass 부분을 이해하고 " MyClass (S arg)"부분을 이해하지만 System.out.println (arg); 어떻게 든 "T"유형과 관련이 있습니다. "반환 정수"유형이 필요하지 않습니까? – djangofan

+0

@ djangofan 예. 차이점은 범위에 있습니다. 'T'의 범위는 전체 클래스 (모든 비 정적 멤버들)입니다 만,'S '의 범위는 단지 생성자입니다. –

+0

@djangofan 생성자가 아무 것도 반환하지 않습니다. 작업은 객체를 초기화하는 것입니다. 내부적으로 생성자는 반환 형식이'void' 인 인스턴스 메서드로 변환됩니다. –

8

Integer 부분은 생성자 호출의 결과의 사용에서 유추 -이 유형 MyClass<Integer>의 변수에 할당하는 것, 따라서 Integer 부분은 다이아몬드 추정된다. 생성자 인수는이 유형과 관련이 없습니다 (동일한 유형이어야하는 경우가 아니면 컴파일 오류 만 발생합니다).

기본적으로 형식 인수가 표현식이있는 컨텍스트에서 분명하지 않은 경우 (여기서 "clear"는 "물론 정확한 규칙을 따른다"는 뜻이다) 컴파일러가 그것을 추론 할 것이다.

+0

확인. 그건 의미가 있습니다. MyClass의 반환 유형을 표시하지 않았습니다. 이것은 MyClass의 생성자에 "return integer"가 포함되어 있음을 의미합니까? 오른 쪽이 "새로운 MyClass <> (" "). getInt();"라고 말하면 나에게 더 의미가 있었을 것이다. – djangofan

+0

@djangofan : "반환 유형"이 없습니다. 생성자를 호출하는 것입니다. 생성자는 항상 생성자가 호출하는 형식을 반환합니다. –