2011-07-02 9 views
0

브리징 방법을 사용할 때, 자바 컴파일러가 필요하다면 서브 컴파일러 (mughal 및 angelikalanger 웹 사이트에서 SCJP를 읽은 후)가 적절하게 재정의 할 수 있도록 추가 할 것입니다. 그러나 이것은 조금 혼란 같은 당 아래 : I 클래스 Y의 이름 충돌을 이해하지만 왜 이름 충돌에 대한이 없습니다Java generics - bridge method

class x { 
    void set (Object t) {} 
} 

:

class x <T> { 
    void set(T t){} 
} 

class y <E> extends x { 
    void set(E e) {} // name clash here 
} 

class z<E> extends x { 
    void set(Object y) {} // no name clash here 
} 

class z1<E> extends x<T> { 
    void set(Object y) {} // name clash here 
} 

삭제 후 : 삭제하기 전에

클래스 z? 또한 클래스 z1에 대한 이름 충돌이 있습니까? 수수께끼

+0

'클래스를. E 형과 T 형은 엄격하게 같은 유형이 아닙니다. 'class z1'에 이름 충돌이 있습니다. –

+0

그냥 추천합니다 : 원시 타입을 사용하지 마십시오. 특별히 원시 타입을 사용하지 마십시오. –

+0

깃발을 받았다. 미안하다. 요청한대로 할 수 없다. –

답변

1

당신이 말한 것처럼, 지우고 난 후에 set 메소드는 Object를 취합니다. z는 Z1 더 잘 이해하기 위해이 설명을 way.see set 메소드를 재정의 할 수 없습니다 그래서 E는 T.의 서브 클래스가 아니기 때문에 x 여기

2
class y <E> extends x { 
    void set(E e) {} // name clash here 
} 

이름 충돌이 발생 삭제 한 후, 비 일반을 확장합니다. 클래스 X의 설정 방법은

void set(java.lang.Object) 

으로 해석됩니다 때문에 여기에 이름 충돌이없는

class z<E> extends x { 
    void set(Object y) {} // no name clash here 
} 

: 클래스 Y에 대한 는

class y <E> extends x<E> { 
    void set(E e) {} 
} 

다음이 있어야 작동합니다 그리고 class z에서 set의 매개 변수는 java.lang.Object.so no clash입니다.

다음 : 당신은 당신이 X에게 줄 어떤 유형의 매개 변수 세트의 매개 변수로 가지고 있기 때문에

다시 여기
class z1<E> extends x<T> { 
    void set(Object y) {} // name clash here 
} 

이름 충돌이 발생합니다. 여기에서는 x 유형의 매개 변수 T를 전달하지만 set 메소드의 매개 변수는 java.lang.Object로 설정됩니다. 따라서 이름 충돌. Z를 들어

가 있어야 작동합니다 :``클래스 x`의 set` 메소드를 오버라이드 (override) z`

class z1<E> extends x<Object> { 
     void set(Object y) {} 
} 
+0

클래스 y와 클래스 z에 대해 이야기 해 보겠습니다. 둘 다 유형 매개 변수 이 클래스 x에 유형 매개 변수 의 부속 유형이 아니며 지우기 후에 클래스 y에 대해 클래스 z와 동일한 메소드 서명이 있기 때문에 클래스 y와 클래스 z의 차이가 표시되지 않습니다. 그렇다면 이름이 클래스 y가 아닌 클래스 z와 충돌하는 이유는 무엇입니까? - yapkm01 5 분 전 – yapkm01

+0

보기, 당신이 방법 세트를 무시하고 있기 때문에, 그것은 몇 가지 규칙을 따라야합니다. y와 z는 모두 타입 매개 변수 을가집니다. 그것은 문제가 아니기 때문에 여기서는 중요하지 않습니다. 이 문제는 set 메소드의 매개 변수 유형 때문에 엄격히 발생합니다. x의 set 메쏘드에서 다음 값을 얻습니다 : 'void set (T t) {}'맞습니까? 이 set 메소드를 오버라이드 (override)하려고하는 모든 서브 클래스는, 형태 T 또는 건네받은 형태의 객체를 참조 할 수있는 T의 슈퍼 클래스의 어느 쪽인지의 파라미터를 가질 필요가 있습니다.현재 z 클래스에서 매개 변수는 Object이며 모든 유형을 참조 할 수 있으며 T. – aps

+0

한 가지 더 : 지우고 난 후에 일어날 일에 대해 생각함으로써 자신을 혼동하지 마십시오. 지우고 난 후 무슨 일이 있어도 상관 없습니다. 제약 조건을 부과하고 제네릭이 더 쉬워 질 것이라고 생각하십시오. – aps