이 코드가 컴파일되지 않는 이유는 무엇입니까?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
클래스 변수를 전달할 수없는 이유는 무엇 instanceof
입니까?
답변
instanceof
운영자는 동일한 참조 유형에서 작동 Integer
처럼, 그리고 개체에 대한 new Integer(213)
. 아마도 다음과 같은 것을 원할 것입니다.
clazz.isInstance(obj)
참고 : 작성하면 코드가 더 간결 해집니다.
public boolean isOf(Class clazz, Object obj){
return clazz.isInstance(obj)
}
더 이상 방법이 필요한지 확실하지 않습니다.
답변
instanceof
명시적인 클래스 이름으로 만 사용할 수 있습니다 (컴파일 시간에 명시 됨). 런타임 검사 를 수행하려면 다음을 수행 해야합니다.
clazz.isInstance(obj)
이것은 clazz.isAssignableFrom(..)
사건을 obj == null
더 잘 다루기 때문에 작은 이점이 있습니다 .
답변
다른 사람들이 언급했듯이 클래스 변수 instanceof
는 Object 의 인스턴스를 참조하고 의 오른손 instanceof
은 type 이어야 하므로 클래스 변수를에 전달할 수 없습니다 . 즉, instanceof
“y는 Object x의 인스턴스”를 의미하지 않고 “y는 X 유형의 인스턴스”를 의미합니다. Object와 유형의 차이점을 모르는 경우 다음을 고려하십시오.
Object o = new Object();
여기서 유형은 Object
이며 o
해당 유형을 가진 Object의 인스턴스에 대한 참조입니다. 그러므로:
if(o instanceof Object)
유효하지만
if(o instanceof o)
o
오른쪽이 유형이 아니라 객체 이기 때문이 아닙니다 .
귀하의 경우에 더 구체적으로 말하자면, 클래스 인스턴스는 유형이 아니라 객체 (JVM에 의해 생성됨)입니다. 귀하의 방법에서 Class
유형이지만 clazz
객체입니다 (음, 객체에 대한 참조)
필요한 것은 객체를 클래스 객체와 비교하는 방법입니다. 이것이 인기있는 것으로 판명되었으므로 이것은 Class Object :의 메소드로 제공됩니다 isInstance()
.
다음은 isInstance에 대한 Java Doc입니다.
public boolean isInstance(Object obj)
지정된 Object가이 Class가 나타내는 객체와 할당 호환되는지 여부를 결정합니다. 이 메소드는 Java 언어 instanceof 연산자와 동적으로 동일합니다. 지정된 Object 인수가 널이 아니고 ClassCastException을 발생시키지 않고이 Class 객체가 나타내는 참조 유형으로 캐스팅 될 수있는 경우 메서드는 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
특히이 Class 객체가 선언 된 클래스를 나타내는 경우이 메서드는 지정된 Object 인수가 표시된 클래스 (또는 하위 클래스 중 하나의 인스턴스)이면 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 이 Class 객체가 배열 클래스를 나타내는 경우이 메서드는 지정된 Object 인수가 ID 변환 또는 확장 참조 변환에 의해 배열 클래스의 객체로 변환 될 수있는 경우 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 이 Class 객체가 인터페이스를 나타내는 경우 지정된 Object 인수의 클래스 또는 수퍼 클래스가이 인터페이스를 구현하면이 메서드는 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 이 Class 객체가 기본 유형을 나타내는 경우이 메서드는 false를 반환합니다.
파라미터 : obj-검사 할 객체
반환 값 : obj가이 클래스의 인스턴스이면 true
이후 : JDK1.1
답변
첫째, instanceof
오른쪽의 피연산자 는 유형의 변수가 아닌 실제 클래스 (예 : obj instanceof Object
또는 obj instanceof Integer
) 여야합니다 Class
. 두 번째로, 당신은 정말로하지 말아야 할 매우 흔한 신참 실수를 저질렀습니다. 다음 패턴 :
if ( 조건식 ) { true를 반환하십시오. } else { 거짓 반환; }
위의 내용은 다음과 같이 리팩토링 될 수 있습니다.
return conditional_expression ;
중복 if … else 문을 제거하므로 항상 해당 리팩토링을 수행해야합니다. 마찬가지로 식은 동일한 결과로 리팩토링 할 수 있습니다.return conditional_expression ? true : false;