2013-05-29 4 views
4

나는 모든 일반 형식 변수가 메서드 "형식 매개 변수 섹션"의 시작 부분에서 일반 정의에서 결정된 상한값으로 바뀌 었음을 알고 있습니다.제네릭 형식 및 할당 문제

이 Deitel 책 사실

에서이다, 모든 유형의 매개 변수는 타입 파라미터 섹션에 지정된 유형 매개 변수의 바인딩 위 소위로 대체됩니다.

그에 따라, 서브 코드가

public static <E extends Number> void A() 
{ 

E x= new Double(2.2); 

} 

는하지만 컴파일러는 나에게 참이어야가 E에서 컴파일 오류가 X = 새로운 더블 (2.2);인데, 번이 숫자이기 때문에 이것이 반드시 있어야합니다.

나는 캐스팅을 통해 문제를 처리하고 해결하는 방법을 알고 있지만, 왜 이것이 발생하는지 묻습니다.

+0

어떤 오류가 발생합니까? – bmargulies

답변

6

E이 숫자 일 뿐이므로 Double이 아닙니다.

E가 정수이면 어떻게 될까요? E는 여전히 숫자이지만 Double에 정수를 할당합니다. 따라서 주조 동작이 일관성이 있으며, Number은 모든 종류의 다른 유형이 될 수 있습니다. 따라서

EDIT의 EDIT : The Deitel 문은 여전히 ​​정확합니다. Double을 Number 또는 Object에 할당 한 경우 당신은 주조 할 필요가 없을 것입니다. 이 경우에도 E는 "위쪽으로"할당하지 않고 두 개의 가능한 다른 Number 유형간에 "옆으로"할당합니다. E가 Short 또는 Integer 인 경우 이러한 경우 캐스팅하지 않고 Double을 할당 할 수 없기를 기대합니다.

+0

이것은 deitel book "java how to program"의 인용문이 잘못되었음을 의미합니까? – Aladdin

+1

정확하지 않습니다. 이 문장은 제네릭이 어떻게 런타임에 구현되는지에 대해 설명하지만 제네릭에 대해 어떻게 생각해야하는지에 대해서는 정확하게 설명하지 않습니다. –

+0

설명 할 수 있습니까 ?? ** 런타임시 제네릭 구현 방법 ** 내 생각에 추상화를 제거하려면 – Aladdin

3

Number 또는 Number의 하위 유형입니다. 예를 들어, E이 될 수있는 Integer, Long, Double 등 코드가 컴파일되지 않는 이유는 - EInteger 인 경우, 예를 들어, 유형 Integer의 변수에 Double을 할당 할 수 잘못 될 것이다.

0

아시다시피 모두 ENumber입니다. 유형 EInteger 일 수 있으며, Number의 하위 클래스이기도합니다.

Integer 유형의 x 변수에 할당 new Double(2.2)을 할당하는 것은별로 중요하지 않습니다.

1

아직 완벽하게 작동합니다!

public static <E extends Number> void A() { 
    E x = (E)new Double(2.2); 
} 

컴파일러에게 좋은 점이 있으면 좋겠습니다. 당신이해야 할 일은 그것이 무엇을 의미하는지 말해주는 것입니다.이 제네릭 어떻게해야하지입니다 ... 집에서 우리의 독자들에게

public class Test { 
    public static <E extends Number> E makeOne() { 
    E x = (E) new Double(2.2); 
    return x; 
    } 

    // Some real compiler abuse. 
    public void test() { 
    Integer one = Test.<Integer>makeOne(); 
    Double two = Test.<Double>makeOne(); 
    Number three = Test.<Double>makeOne(); 
    } 

} 

:

그리고 - - 물론 우리가 실제로 우리의 컴파일러에게 거짓말을하고 있기 때문에 지금 우리가 같은 무서운 물건을 할 수 있습니다 익숙한.

오, 그런데, 당신이 문제를보고있는 이유는 당신이 캐스팅하지 않고 유형이 일치하지 않는다는 것입니다.

문제는 개념적 문제입니다. 일반 조항 <E extends Number>에 전달 된 유형은 이 아니며 결국 유형을위한 자리 표시 자입니다. 사용할 유형에 대한 결정을 지연시키는 것이 아닙니다. 절과 일치하는 형식 만 사용하겠다는 약속을하고 있으며 컴파일러가 약속을 지키면 경고해야합니다.

코드가 허용되지 않는 이유는 그 일을하기 때문에 그 약속을 어기는 것입니다. 호출자가 Number을 사용할 수 있지만 특정 Number (Double)을 사용하므로 사용자가 직접 지정한 규칙을 위반하고 컴파일러에서 알려줍니다.

관련 문제