2013-09-04 3 views
3

이것은 내 클래스 구조입니다.Java 일반 유형 식별

public class Node<T> { 
    private T value; 

    public Node(T val) { 
     this.value = val; 
    } 

    public T evaluate() { 
     return value; 
    }; 

} 

T는 Integer, Double, Date, Long 또는 String 수있다.

이제 T 타입이 무엇인지 정확히 알 수 있습니까? 감사.

+1

아니, 없다. 모든 generic의 type 매개 변수는 런타임에 제거됩니다. 자세한 내용은 런타임 유형 삭제를 참조하십시오. –

+1

http://stackoverflow.com/questions/1004022/java-generic-class-determine-type –

답변

7

당신은그 일반적인 변수getClass() 방법 을 호출하고 클래스를 찾을 수 있습니다. 기본적으로 제네릭은 런타임에 지워지므로 무제한 제네릭은 java.lang.Object입니다. 그래서 당신은 실행시 그 일반적인 변수

Object 클래스에서 지원하는 모든 메소드를 호출 할 수 있습니다, 일반 객체에 getClass() 예를 들어 일반

을 대체하는 데 사용 된 실제 class를 반환합니다

public class Node<T> { 
    private T value; 

    public Node(T val) { 
     Class<?> clazz = val.getClass(); 
     checkType(clazz); 
     this.value = val; 
    } 

    public T evaluate() { 
     return value; 
    }; 

    private void checkType(Class<?> c) { 
     if(c.getName().equals(Integer.class.getName())) { 
     //... 
     } 
    } 

} 
+0

그게'Node' 클래스가 아니라 T가 될 줄 알아? – LPD

+0

나는 그 downvote을하지 않았다. 귀하의 제안에 감사드립니다. 나 지금 그걸 시도하자. – LPD

+0

@ LPD 여기서 중요한 점은 클래스의 실제 인스턴스가있는 경우이를 식별 할 수 있다는 것입니다. 인스턴스가 없다면 방법이 없습니다. –

-1

노드가 Number 만 저장한다는 것을 알고 있으면 제한 할 수 있습니다.

public class Node<T extends Number> { 

    private final T value; 

    public Node(T val) { 
     this.value = val; 
    } 

    public T evaluate() { 
     return value; 
    }; 

    public Class<? extends Number> type() { 
     return value.getClass(); 
    }  

} 
1

훨씬 쉽게, instanceof를 사용합니다.

@BaileyS에서 언급 한 바와 같이

없이 장소에서 T의 정보를 얻을 수있는 방법은 없습니다 : 이미 승인 된 응답이 있지만

public class Node<T> { 
    private T value; 

    public Node(T val) { 
    checkType(val); 
    this.value = val; 
    } 

    public T evaluate() { 
    return value; 
    }; 

    private void checkType(T val) { 
    if(val instanceof Integer) { 
     //... 
    } 
    } 

} 
1

는, 나는 또 하나의 대답을 추가하는 것이 좋을 것 같아요 T의 인스턴스

이 솔루션은 왜 T를 원하는지, 어떻게 사용하는지에 따라 크게 달라집니다. 일반적으로 로직 (예 : T의 새 인스턴스 작성)에 T 유형이 필요한 경우 보통 Class 인스턴스를 제공하여 수행합니다.

예를 들어, 노드 클래스가 될 수 있습니다 :

public class Node<T> { 
    private T value; 
    private Class<T> valueType; 

    public Node(T val, Class<T> valueType) { 
     this.value = val; 
     this.valueType = valueType; 
    } 
    //.....  
}