2013-01-07 3 views
1

다음 줄로 오류를 격리했습니다 : string.getClass() == jojo.getClass() 이 줄은 두 개의 Class 객체를 생성해서는 안되며 두 참조) 같은 개체를 가리 킵니다? false 값을 반환하는 대신 코드가 실행되지 않습니다.== 연산자로 컴파일 오류가 발생했습니다.

public class Tester 
{ 
    public static void main(String[] args) 
    { 
     OreoJar jojo = new OreoJar(0); 
     OreoJar momo = new OreoJar(1); 
     String string = "Hello"; 

     if (momo.getClass() == jojo.getClass()) 
     { 
      System.out.println("Momo and jojo are of the same class"); 
     } 

     if (string.getClass() == jojo.getClass()) 
     { 
      System.out.println("String and jojo are of the same class"); 
     } 
    } 
} 

public class OreoJar 
{ 
    int oreos; 

    public OreoJar(int oreos) 
    { 
     this.oreos = oreos; 
    } 

    public void count() 
    { 
     System.out.println(oreos + " oreos in this jar!"); 
    } 
} 

이 댓글이 가지 숨겨져 내가 생각하는 그것은 초보자에게 가장 적합한 이후

이 JLS에 -According (예 : 나 자신으로) 언급 할 가치 "그것은 컴파일 타임 오류입니다 형 변환에 의해 피연산자의 타입을 다른 타입의 타입으로 변환하는 것이 불가능하다면 타입 A와 타입 B의 두 가지 참조가 비교 될 수있다. 오직 A가 B로 캐스트 될 수 있거나 B가 B가 될 수있는 경우에만 비교 될 수있다. A에 던지십시오 - Patricia Shanahan

+6

당신이 * 컴파일 오류가 발생하는 경우 * (그것은 이상한 너무 소리)와이 필요 우리의 도움, 그러면 상식은 당신이 여기에 오류를 게시해야한다고 말합니다. –

+3

오류가 무엇인지 알려주시겠습니까? – OldProgrammer

+1

'public class OreoJar'를'private class OreoJar'로 만들고 다시 시도 하시겠습니까? – Marcus

답변

6

나는 OP가 컴파일 오류를 인용해야한다는 점에 동의합니다.

어쨌든 누구든지 컴파일을 실제로 수행하면 컴파일 오류가 아주 분명합니다.

오류 :

Tester.java:15: incomparable types: java.lang.Class<capture#125 of ? extends java.lang.String> and java.lang.Class<capture#29 of ? extends OreoJar> 
    if (string.getClass() == jojo.getClass()){ 
         ^

이유가 분명한 것 같다. Object.getClass()의 자바 독 가입일

:

OreoJar 인스턴스 Class<? extends OreoJar>

참조를 반환하려고하면서 문자열 인스턴스가 Class<? extends String>에 대한 참조를 반환하려고 수단

The java.lang.Class object that represents the runtime class of the 
object. The result is of type Class<? extends X> where X is the 
erasure of the static type of the expression on which getClass is 
called. 

컴파일러는 String을 확장하는 모든 유형이 OreoJar를 확장 할 수있는 가능성이 없다는 것을 알고 있으므로 두 유형은 단순히 호환되지 않습니다. 그래서 비교가 컴파일 오류를 일으킬 것입니다.


A가 주제를 비트하지만 내가 언급 할 가치가 있다고 생각 당신이 말했다 :

이 줄이 두 클래스의 객체를 생성하고이 같은 객체

를 가리키는 경우 다음 확인 안

더 명확하게 이해하는 것이 낫다고 생각합니다. 두 클래스 ""을 만들지는 않습니다.. getClass()는 참조을 Class 객체로 반환합니다.그리고, 그것은 항상 객체를 가리 수있는 참조입니다 객체를 가리 키지 객체

+0

필자는 Java의 제네릭에 익숙하지 않은데 특히 타입 지우는 경우에 그렇습니다. 그래서, 당신의 대답이 나에게 맞는 것처럼 보일 때, 그것은 내 마음 속에이 질문을 만듭니다 : 어떤 타입이 비교 될 수 있습니까? –

+2

@TheodorosChatzigiannakis JLS에 따르면 "변환 변환을 통해 피연산자 유형을 다른 유형으로 변환하는 것이 불가능할 경우 컴파일 타임 오류입니다"따라서 유형 A와 B의 두 가지 참조를 비교할 수 있습니다. 그리고 A가 B에 캐스트 될 수 있거나 B가 B로 캐스트 될 수있는 경우에만. –

+0

Hmmm, 그것은 .equals()를 오버라이드하고 체크 할 때 문제없이'.getClass()'를 사용할 수있는 이유를 설명합니다. 인수의 클래스 : 모든 클래스를'Object'에 캐스트 할 수 있습니다. 이것은'Class 를'Class '(그리고 아마 후자는 아마도'Class '과 같을 것입니다.) – fge

-1

getClass()는 종류의 사례를 돌려 보낸다. getClass().getName()은 문자열을 반환합니다. String.equals(otherString) 메서드는 문자열이 동일한 지 비교하는 올바른 방법입니다.

+1

그러나 원래의 포스터가이 둘의 차이에 대해 혼동하지 않는 한 * 컴파일 * 오류가 아닌 * 논리 * 오류가 발생합니다. –

+0

질문은 두 참조가 같은 개체를 가리키는 지 확인하는 것이 목적임을 나타냅니다. == 그렇게하는 올바른 방법입니다. a.equals (b)는 a와 b에 의해 참조되는 두 개의 별개의 객체가 평등과 동등한 지 여부를 묻는 질문입니다. –

+1

OP가 문자열을 비교하려고 한 것을 보지 못했습니다. javadoc을'.getClass()'로 오해하지 않는 한. 잘못 읽었습니다. – fge

3

내가 컴파일하지 않는 이유는 클래스에 일반 구성 요소가 있기 때문이라고 생각합니다. 사용해보십시오 momo.getClass().equals(jojo.getClass()) 그리고 비슷한 효과를 내기 위해 클래스의 정식 이름을 비교해보십시오 : momo.getClass().getCanonicalName().equals(jojo.getClass().getCanonicalName())

관련 문제