2010-05-06 6 views
2

매개 변수로 특정 상위 유형을 받아들이는 메소드가 제공됩니다. 이 메서드 내에서 전달 된 개체의 실제 클래스를 확인하는 방법이 있습니까? 나는. 허용되는 매개 변수의 하위 유형이 실제로 전달 된 경우 해당 유형을 찾는 방법이 있습니까? 이것이 가능하지 않다면 왜 (언어 디자인 관점에서) 설명 할 수 없습니까? 감사합니다자바 - 객체의 클래스를 알려주는 방법?

업데이트 : 단지 객체가 MyType의 하위 유형이 실제로 경우 메소드 서명이 MyType 인 것으로 매개 변수를 지정하기 때문에 내가

Context: MySubType extends MyType 

void doSomething(MyType myType) { 
    //determine if myType is MyType OR one of its subclasses 
    //i.e. if MySubType is passed as a parameter, I know that it can be explicitly 
    //cast to a MySubType, but how can I ascertain that its this type 
    //considering that there could be many subclasses of MyType 
} 

분명했다 확인, 그럼 어떻게 하나가 알 수 있도록하기 위해 (그리고 어느).

+1

n을 할 이렇게하고 싶지 않아. 대신 "특정 수퍼 유형"의 모든 하위 클래스가 공통 메소드 및 속성을 갖도록하여 다형성을 유지하려고합니다. 왜 당신은 다형성 해결책을 피하고 있습니까? –

+0

다형성 해결책을 피할 수는 없지만 가능한지 궁금합니다. 그리고 가능하지 않다면 (아마도 누군가가 제안한 것처럼 반사없이), 왜 안 되겠습니까? – lkm

답변

5

Object 클래스의 javadoc을 보면 모든 객체가 getClass()을 지원한다는 것을 알 수 있습니다. 그건 대상의 Class이고 거기에서 갈 수 있습니다.

개체가 MyType 인 경우 getClass() == MyType.class'. If the object is a superclass, then getClass()! = MyType.class`입니다.

이러한 가능성이 있습니다. 매개 변수의 유형이 MyType이고 MyType이 클래스이고 인터페이스가 아닌 경우 객체는 MyClass이거나 하위 유형입니다. 하위 유형 인 경우 getClass()은 하위 유형에 대해 Class을 리턴합니다. Class API를 사용하여 탐색 할 수 있습니다.

리플렉션을 사용하여 유형 계층 구조를 탐색 할 수 있습니다. MyType.class에 직접 하위 클래스 목록을 요청하고 거기에서 다시 돌아와 좋은 시간을 가질 수 있습니다. 그러나 당신은 필요가 없습니다.

+0

이것이 내가 생각한 것 같지 않습니다 .. – lkm

+0

@lkm - 편집을 참조하십시오. – bmargulies

+0

개체가 하위 클래스이면 무엇입니까? 다음 getClass() == MyType.class,하지만 어떻게 알아낼 수 getClass() == MySubType.class? – lkm

1

예 - 클래스의 모든 인스턴스 유형을 검사 할 수있는 Trail이라는 리플렉션 API가 내장되어 있습니다. Object 클래스에서 상속 된 getClass() 메서드는 검사 할 수있는 Class 개체를 제공합니다. 좋은 출발점은 Trail tutorial from Sun입니다.

+1

Trail은 자습서의 Sun의 옛 이름 일뿐입니다. 이것은 일반적으로 리플렉션 API로 알려져 있습니다 : -p –

+0

완전히 당혹 스럽네요. (: –

1

MyType이 수퍼 클래스 유형이라고 가정합니다.

1/당신은 그냥 당신의 슈퍼 클래스 유형에 속하지 않는 것을 알고 싶은 경우 : 당신이 m 특정 서브 클래스에 속하는지 확인하고 싶은 경우

if (m.getClass() != MyType.getClass()) 

2 /를 확인할 수 있습니다, I 방법이 있다고 생각하지 않는다, 당신은

if (m.getClass() == MySubType) { 
} 

처럼 하드 코딩하거나 다음을 사용할 수 있습니다

if (!(m instanceof MySubType)) { 
} 
+0

정확히 이것은 내가 생각한 것입니다. 그러나 이것이 왜 궁금합니다. 메서드에 전달 된 유형을 런타임에 확인할 수 있다는 것을 알고 있습니다. 그러나 이것을 수행하는 쉬운 방법은 없습니다 (리플렉션없이). 일반적으로이 기능이 필요하지 않습니까? – lkm

+0

예, 일반적으로 수퍼 유형으로 전달할 때 다형성이 필요합니다. 즉, 원하는대로 모든 매개 변수 객체를 같은 것으로 취급하십시오. 따라서 모든 하위 유형을 다르게 처리해야만 다형성을 쓸모 없게 만들면 OOP 측면에서 좋지 않을 것입니다. 내가해야 할 일이 무엇인지 모르겠지만 다른 서브 클래스 유형을 추상화하는 다른 인터페이스 유형을 작성할 수 있다고 생각하면 – vodkhang

+0

instanceof가 필요한 것일뿐입니다. if (object instanceof MyType) 의미 :이 개체 인스턴스가 MyType이거나 MyType 하위 클래스 중 하나입니다. – rompetroll

관련 문제