2014-06-08 3 views
2

작은 딸꾹질로 인해 기본적인 질문이 생겼습니다. 나는 다음과 같은 경우에 클래스 동등성을 확인하려는 (학문적 호기심 - instanceof 또는 isinstance 날 직접하지 마십시오) :Java의 클래스 등가

public class staticChild extends staticParent{ 
    .... 
     public static void main(String[] args){ 
     staticChild thisobj=new staticChild(); 
     System.out.println(thisobj.getClass()==staticParent.class); 
    } 

} 

이 컴파일 오류를 제공합니다 :이 작업을 수행 무엇

error: incomparable types: Class<CAP#1> and Class<staticParent> 
       System.out.println(thisobj.getClass()==staticParent.class); 
where CAP#1 is a fresh type-variable: CAP#1 extends staticChild from capture of ? extends staticChild 
  1. 평균?
  2. 유형과 클래스의 차이점은 무엇입니까? (구체적으로이 컨텍스트는 무엇입니까? staticchild의 유형과 클래스는 무엇입니까?)
  3. 어떻게하면 컴파일 오류를 없앨 수 있습니까?
+0

클래스 은 일반적이므로 컴파일러는이 비교가 무의미하다는 것을 알 수 있습니다. 두 클래스를 모두 클래스로 캐스팅하면 컴파일을 강제 할 수 있어야합니다. –

답변

2

이 유형 staticChild으로 선언되고, 식 :

thisobj.getClass() 

유형 Class<? extends staticChild>의 개체를 반환합니다. 이를 유형 Class<staticParent>의 오브젝트와 비교하려고하지만 컴파일러가 제네릭 유형 매개 변수와 일! 할 수 없습니다. staticParentstaticChild을 확장 할 수 없으므로 에 할당 할 수있는 것이입니다.

오류를 제거하는 방법에는 여러 가지가 있습니다. 예를 들어, thisobjObject (또는 유형이 staticParent 인 유형)으로 선언 할 수 있습니다.

그러나 테스트가 항상 실패한다는 점에 유의하십시오.

1
  1. 그것은 자신의 유형이 서로 전환하지 않기 때문에 당신은 비교하려는 두 개의 오브젝트가 동일한 수 없을 수 있다는 것을 의미한다.

It is a compile-time error if it is impossible to convert the type of either operand to the type of the other by a casting conversion (§5.5). The run-time values of the two operands would necessarily be unequal.

  1. , JLS 15.21.3에 따르면 이러한 맥락에서 종류와 클래스 사이에는 차이가 없습니다.

  2. 서로 변환 할 수없는 두 개체를 비교하지 마십시오. 이 경우 Class<CAP#1>Class<staticParent>을 비교합니다. 그러나 오류를 "수정"하려는 경우 false을 항상 반환한다는 이해하에 .equals을 대신 사용할 수 있습니다. thisobj 이후

    System.out.println(thisobj.getClass().equals(staticParent.class)); 
    
0

코드에 오류가 있음을 의미합니다.

이 오류는 호환되지 않는 형식이 있음을 나타냅니다. 예, 오류 메시지에서 볼 수 있지만 호환되지 않는 유형은 무엇입니까? "=="를 통해 두 클래스를 비교하고 있습니다.

당신이 thisobj이 staticParent의 인스턴스가 있는지 확인하려고하는 경우에 당신은 사용해야

System.out.println(thisobj instanceof staticParent); 

을하지만 당신에 대한 비교를 실행하고 있기 때문에 구체적으로 오류가 두 개의 클래스를 기반으로 참/거짓이 수 평등하지 마십시오.

1

컴파일러는 클래스가 동등하지 않다는 것을 이미 충분히 똑똑합니다. 그것은 당신이 평범한 프로그램을 쓰고 있다고 가정하고, 학업 과제를 해결하지 않고, 최선을 다해 돕기 위해 노력합니다.

여전히 첫 번째 유형 클래스의 일반 변수로 "때문에 학문적 호기심의"수동으로 수행 할당해야하는 경우

Class a = staticChild.class; 
Class b = staticParent.class; 

if (a == b) // false 

("원시 유형"경고를 표시하지만 컴파일해야한다).

Object x = a.newInstance(); 
Object y = b.newInstance(); 

나머지는 사용자의 책임입니다.