2014-11-12 1 views
3

intellij를 사용하는 AndroidStudio에서 내 코드에서 다음과 같은 제안을 받고 있습니다. 나는 왜이 제안이 이루어지고 있는지 궁금해했다.`instanceof` 테스트는 중복되어`! = null`로 대체 될 수 있습니까?

ParentB을 상속하고 ParentB을 상속하는 Child 클래스가 여러 개 있습니다. ParentA에서 상속됩니다.

나는 어떤 자식 클래스가 ParentB인지 테스트해야하는 조건이 있습니다. 나는 4 명의 아이들이 있다고 가정 해 봅시다. ChildA, ChildB, ChildCChildD. 이 아이들은 모두 Child에서 상속받습니다.

public void test(Child myChild) { 

    anotherTest((ChildA)myChild); 
    if (myChild instanceof ChildA) { 
     //dosomething 
    } else if(myChild instanceof ChildB) { 
     //dosomething 
    } 
} 

public void anotherTest(ChildA theChild) { 
    //dosomething 
} 

public ParentB extends ParentA { 
} 

public Child extends ParentB { 
} 

public ChildA extends Child { 
} 

나는 다음과 같은 제안을받을 조건을 테스트하고 경우 :

그래서 나는 다음 있습니다. Condition "myChild instanceof ChildA" is redundant and can be replaced with "!=null".

왜 나는 그 제안을 받고 있습니까? 제안이 정확합니까?


편집.

조건 앞에 메서드를 추가했습니다. 메소드를 주석 처리 한 후 제안을 제거합니다. 그것은 이미 그것을 ChildA으로 던지려고 시도했기 때문에 그곳에서 실패했을 것입니다. 그래서 ide는 단지 그것이 통과한다고 가정하고 그 후에 null을 확인할 수 있다고 말합니까?

감사

+6

문제를 설명하는 짧은 예를 보여 주면 도움이 될 것입니다. 눈에 보이는 것보다 더 많은 것이 있다고 생각합니다. –

+2

예는 여전히 _complete_가 아닙니다. 'ChildB'가 누락되었거나 if 블록에서 수행중인 작업입니다. – Thomas

+1

우리가 정보가 부족하기 때문에 여기에 맞춰보세요 :'Child'의 _ 하위 서브 클래스를 검사하고 IDE 내에서 동일한 작업을 항상 수행한다면 _only way_는 'doSomething'이 아니라 'myChild null이었다. – Thomas

답변

7

는 myChild이 ChildA (그리고 null이 아닌)의 인스턴스가 아닌 경우 anotherTest를 호출 할 때 ClassCastException를 얻을 것이다().

my 블록이 null이거나 ChildA의 인스턴스이고 instanceof 검사가 중복되는 경우에만 if 블록에 접근 할 수 있습니다.

+0

감사. 이것은 제가 편집 할 때했던 의견에서 추측하고 있었던 것입니다. – prolink007

0

사례 : 객체가 null가 아닌 경우 두 경우 모두 거짓

if(obj instanceof MyClass) {...} 

if (obj == null) {...} 

돌아갑니다. null 참조가 어떤 것의 인스턴스가 아니기 때문입니다. 그건 의미가 있습니다. 그러나 instanceof은 전혀 중복되지 않습니다. 그것은 다른 방향입니다. 특정 객체가 일부 클래스의 인스턴스인지 확인해야하는 경우 null을 명시 적으로 검사하는 것은 중복됩니다. 예를 들어 :

if(obj == null) {...} // This check is redundant 
else if (obj instanceof MyClass) {...} 

따라서, 제안 "상태"ChildA instanceof를는 myChild는 "중복 및 교체 할 수 있습니다"= 널 (null) "는"정확한 전혀하지 않습니다!. 어느 이러한 개체의

Apple apple = new Apple(); 
Orange orange = new Orange(); 

는 null이 없으며 서로 (instanceof) 호환됩니다.

if (apple instanceof Orange) {...} // false 
if (orange instanceof Apple) {...} // false 
if (apple != null) {...} // true: does this mean an apple 'is-an' orange? 
if (orange != null) {...} // true: does this mean an orange 'is-an' apple? 

결론 :이 널 (null)에 대한 검사를 포함하기 때문에 instanceof를 사용하여 객체 참조 검사는 중복되지 않습니다.

관련 문제