2010-01-23 1 views
2

프리미티브와 래퍼를 사용하여 확대의 개념을 이해했습니다. 그러나 다른 객체와 관련하여 나는 확대 및 암시 적 캐스팅과 혼동을 느낍니다. 예 :Reference Casting and Widening과 혼동하기 w.r.t Java의 객체

 Class Animal{ 
     } 

     Class Dog extends Animal{ 

     public static void main(args String[]){ 

     Dog d = new Dog(); 
     d.go(d); 
     } 

     void go(Animal a){ } 
     } 

편집 : 문제는 어느 것이 확대 또는 캐스팅을 선호하며 그 이유는 무엇입니까?

+2

그리고 질문은? –

답변

1

(내 의견으로는) 주조가 필요하지 않은 경우에는하지 마십시오. 코드가 읽기 쉽습니다. 특히

, 구문 :

d.go(d); 

내가 내 첫 번째 시도에서 아래에 설명하는 이유 확대를 활용,보다 간결하고, 기본적으로

d.go((Animal)d); 

만큼 정확 당신의 질문에 대답하십시오.


글쎄, 그것은 코드가 성취하고자하는 바에 달려 있습니다. 당신이 동물, 개 또는 다른 어떤 종류를 처리 할 수있는 기능을 원하는 경우

는, 당신은 입력으로 동물을해야한다.

는 만 개 가지고, 또는 만 입력으로 개를 취하는 작업으로 의미가 무엇인가를 필요로하는 기능을 원하는 경우에, 당신은 입력 개가으로해야한다.

편집 : 아마도 좀 더 인위적인 예가 이것이 직설적 인 답을 가진 질문이 아닌 이유를 설명 할 것입니다. Java에서 모든 객체는 Object의 하위 객체이므로 매개 변수 Object foo을 사용하는 모든 메소드를 작성할 수 있습니다.

때때로이 유용 할 수 있지만, 그 사용의 경우는 정말 매우 제한적입니다, 당신은 Object에 정의 된 방법으로 제한하고 있습니다.

는 또한 Object 인에 대한 Dog을 알고 대신 가정하자. 오히려 ObjectDog의 인스턴스를 전달하는 대신 당신은 Dog특정 몇 가지 속성을 가져올 수도 있습니다. 기본적으로 어떤 함수에 대한 인수가 일부 계약에 부합하는지 확인해야하는 경우 인수를 약간 다르게 형식을 따르는 형식으로 제한해야합니다 : 개가 도그라는 것을 알고 싶다면으로 선언하십시오. 일반적으로

, 당신이해야한다 (제 생각에) 당신이 성취해야 할 어떤 계약을 따르는 "넓은"유형을 선택합니다. 동물이 동물임을 알 필요가 있다면 동물이라고 선언해야합니다.

+0

나는 당신이 무엇을 말하려고하는지 이해하지 못했습니다. 나는 위의 예에서 어느 것이 prefererd인지 물었다. – GuruKulki

+0

@ 구루 쿨키 ("구루 쿨키") 어떤 "선호도"는 코드가 성취해야하는 것에 달려 있습니다 (여기에는 보편적 인 대답이 없습니다). 나는 넓히는 것이 선호 될 때의 예를 드렸고, 좁을 때는 선호했다. –

+0

하지만 넓히기가 우선시되고 주조가 선호 될 때 나는 물었다. – GuruKulki

0

마크에 동의한다는 말에 동의합니다. 기본적으로 하위 유형에 선언 된 유형의 캐스트가 "나쁜"이라고 말하는 엄지 손가락 규칙을 사용합니다.그렇다면 어딘가에 방법

void go(Animal a){ ... }

에서 당신은 확실히 (가능한 경우)의 유형 강아지의 매개 변수 타입 동물의 매개 변수를 변경해야

Dog d = (Dog) a;

같은 캐스트가 필요합니다. 메소드가 캐스트가없는 Animal의 모든 부속 유형에 대해 작동하는 경우 그대로 두십시오.