2010-12-08 3 views
0

내 메소드는 Object를 입력으로받습니다. 어떻게 타입인지를 어떻게 결정합니까? 그래서 예를 들면개체 유형을 감지 한 다음 그에 따라 캐스트 하시겠습니까?

다음 binarySearch 방법 내부 binarySearch(Object o);

, 난 개체 오의 유형 (또는 클래스)를 결정하는 방법이 필요합니다. 그럼 나는 그 타입으로 그것을 캐스팅해야합니다. 내가 어떻게 그럴까 ???

그리고 더 구체적으로 Object o는 기본 클래스의 하위 클래스입니다 (EG SalariedEmp는 Employee의 자식 임). 특히 기본 클래스가 필요합니다.

편집 : 나는 완전히 다른 질문이어야하는, 내가 원하는 것을하는 방법을 알아 냈다. Comparable의 .compareTo 메서드를 사용하여 해당 개체의 개인 데이터를 기반으로 두 개체를 비교하는 방법을 설정해야했습니다. 내가해야 할 일은 내 클래스를 implements 키워드를 사용하여 'Comparable'로 구현하는 것입니다. 따라서 어떤 객체 유형이 내 binarySearch 메서드에서 비교 되더라도 동일한 (알 수없는) 유형이며 Comparable이 구현되어 있으면 작동합니다. 이것은 내 binarySearch 메소드를 모든 유형의 비교 가능한 클래스와 함께 재사용 가능하게 만듭니다.

그래서 모든 공정성에서 나는 원래 질문을 다루는 대답을 수락 할 것입니다. 이 작업을 수행하는

:

+2

왜 객체 대신 직원을 고용하게하지 마시겠습니까? –

+3

일반적으로 instanceof 연산자를 사용하면이 작업을 수행 할 수 있지만 더 많은 코드를 게시하면 컬렉션을 다루는 것처럼 보일 수 있으므로 제네릭을 사용하여 더 나은 솔루션을 찾을 수 있습니다. –

+2

"유형을 결정하는 데 ... 필요합니다."** ** 왜 **? 기본 클래스의 인스턴스를 동일한 컨테이너에 넣으면 일반적으로 파생 된 유형을 잊어 버릴 수 있습니다. 기본 유형의 인터페이스를 구현한다는 사실에만 관심이 있음을 문서화합니다. –

답변

3

두 가지 방법 :

  1. instanceof 연산자를 사용합니다.

  2. 개체에 getClass()을 호출하십시오 (먼저 null인지 확인하십시오).

3
if (o instanceof SalariedEmp) 
    doSomethingWith((SalariedEmp)o); 
3

할 수 있습니다 instanceof 연산자를 사용하거나 인스턴스에 .getClass()를 호출하여 RTTI (런타임 형식 식별)를 사용하지만 거의 항상 사용하고있는 슈퍼 타입이 있다는 표시입니다 잘못된 수퍼 유형이거나 잘못 설계된 것입니다.

적어도 당신이 적어도 직원이 있다는 것을 알고 있으므로 Object를 사용할 필요는 없습니다.

객체 지향 패러다임은 객체 인스턴스를 묻지 않는다는 것입니다. 무엇입니까? 무엇인가해야합니다. 이 경우 Employee 객체에 수행하도록 요청할 수있는 몇 가지 옵션을 선택할 수 있습니다. 어떤 모델이 가장 적합한 모델인지 정확히 알 수 있습니다.

Employee 기본 클래스에 가상 메서드 boolean isSalaried()을 추가하여 월급을 받고 물을 던질 수 있는지 물어볼 수 있습니다. 기본 메서드는 false를 반환하지만 SalariedEmployee는 해당 메서드를 재정 의하여 true를 반환합니다.

그러나 RTTI를 피할 수는 있지만 캐스트를 피할 수는 없습니다. SalariedEmployee asSalariedEmployee() 메서드를 추가 할 수 있습니다.이 클래스는 기본 클래스에서 null을 반환하고 SalariedEmployee에서는 this을 반환합니다. 그것은 당신에게 "안전한"캐스트를 제공하지만 여전히 null에 대한 테스트가 필요합니다.

또는 Money에 getSalary() 메서드를 Employee에 추가하면됩니다.이제는 캐스팅을 할 필요가 없지만 비영리 직원의 급여가 무엇인지 결정해야합니다. null, 0 또는 NaN (숫자가 아닌 특수한 값)이 될 수 있습니다.

null을 반환하기로 결정한 경우 (예 : 값 추가) null을 테스트해야하는 경우도 있고 테스트 할 필요가없는 (예 : 급여를 .equals()로 전달하는 경우) 어떤 경우이든, instance.equals (null)는 Object.equals()의 스펙에 의해 false를 반환해야합니다.

0을 반환하면 null에 대한 테스트없이 추가 할 수 있지만 같음은 다소 이상 할 수 있습니다. 급여가없는 두 명의 시간제 근로자는 동일한 (존재하지 않는) 급여를 받는다는 것이 사실입니까? 그것은 당신이 모델링하는 것에 달려 있습니다. 참이면 0을 반환합니다.

두 명의 시간제 근로자가 존재하지 않는 급여가 같지 않다면 NaN 값을 반환하십시오. 이것은 "Null Object Pattern"의 정당한 경우입니다.

+0

당신은 매우 훌륭한 세부 사항을 제공했지만 Mike Baranczak은 당신이하기 전에 기술적으로 정답을 제공해 주셨습니다. 멋진 정보를 주셔서 대단히 감사합니다. – trusktr

관련 문제