2012-08-28 2 views
9
public class Test<T>{ 

    public boolean isMember(T item) { 

     if(item instanceof Test) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

항목이 클래스의 인스턴스인지 확인하는 올바른 방법입니까?항목이 일반 클래스의 인스턴스인지 확인하십시오.

몇 가지 검색을했는데 일반 클래스의 경우에는 작동하지 않습니다.

+6

항목이'Test'의 인스턴스인지,'T'의 인스턴스인지, 아니면'Test '의 인스턴스인지 테스트하려고합니까? – StriplingWarrior

+0

@ NinjoeQuah 내 대답을 확인하십시오 – GingerHead

답변

5

하지만, 여기에 몇 가지 가능성은 다음과 같습니다 : 같은 여기로 우리가 조작하는 방법을 볼 수 있습니다

  1. itemT입니까? 예. 그렇지 않으면 아마도 isMember 메소드로 전달 될 수 없습니다. 컴파일러는이를 허용하지 않을 것입니다. (아래의 코멘트에서 Alex의 경고를 참조하십시오.)
  2. itemTest입니까? 귀하의 isMember 메소드를 테스트 해 보면이 코드가 작성되었지만 여기에서 코드 냄새가납니다. TTest이 될 것이라고 기대하지만 시간의 일부는 무엇입니까? 수업을 어떻게 구성하는지 다시 생각해 볼 수 있습니다. 이것은 당신이 다음 방법으로 기록 될 수 원하는 정말 경우에도 : 질문을 구걸

    public boolean isMember(T item) { 
        return (item instanceof Test); 
    } 
    

    은 왜 처음부터 이런 방법이 있나요? 어느 것이 더 쓰기 쉽습니까?

    if(obj instanceof Test) {...} 
    

    또는

    if(Test<Something>.isMember(obj)) {...} 
    

    내가 첫 번째가 간단하다고 주장 것이며, 대부분의 자바 개발자가 사용자 정의 방법보다 더 쉽게 의미를 이해할 수있을 것이다.

  3. itema? Java는 지우개를 사용하여 제네릭을 구현하기 때문에이를 런타임에 알 수있는 방법이 없습니다. 이것이 원하는 경우, Mike Myers의 예와 같이 메소드 서명을 수정해야합니다.

+2

"컴파일러가 허용하지 않을 것입니다." - 클래스에 대한 모든 참조에서 올바른 일반 서명을 사용한다고 가정 할 때, 이는 사실입니다. 'T'의 인스턴스가 아닌 항목을'isMember'에 전달하기 위해 원시 타입'Test'에 대한 참조를 여전히 사용할 수 있습니다. 그러나 컴파일러는 당신이 원한다면 모든 종류의 경고를 던질 것입니다. – Alex

0

T은 변수가 아니며 런타임에 정의 된 클래스의 자리 표시 자입니다. Generics는 컴파일 타임 기능이므로 런타임에 아무런 의미가없는 컴파일 타임에 검사를 추가합니다. 우리는 런타임에 참조되는 객체의 타입을 검사 할 수 있는데 이것은 코드에서 수퍼 클래스 타입이 될 수 있습니다.

void genericMethod(Class<T> tClass) { 
    if(String.class.isAssignableFrom(tClass)) 

또는

void genericMethod(Class<T> tClass, T tArg) { 

참고 타입이되지 않을 수도 있다는 : 우리는 방법에 매개 변수로 유형 T을 통과 할 경우, 우리가해야 할 일은 다음을 같이 명시 적으로 접근하는 것입니다 그것은 당신이 여기에 테스트하려고하는지 불분명

genericMethod(Number.class, 1); 
0

공용 클래스 LinkList 미안 해요 {

public boolean isMemberOfClass(T item) { 

    if(item instanceof LinkList) 
    { 
     return true; 
    } 
    return false; 
} 

}

, 나는 대답으로 질문을 게시 할 suppost 아니에요.

LinkList 클래스는 제네릭 클래스입니다. 이 함수는 항목이 클래스에 속하는지 확인하는 것입니다. 같은 T를 가지고 있는지 확인하십시오.

관련 문제