[java] Java에서 변수 유형을 확인하는 방법은 무엇입니까?

내 변수가 int, array, double 등인지 어떻게 확인할 수 있습니까?

편집 : 예를 들어, 변수가 배열인지 어떻게 확인할 수 있습니까? 이를 수행하는 기능이 있습니까?



답변

Java는 정적으로 형식화 된 언어이므로 컴파일러가 대부분의 검사를 수행합니다. 변수를 특정 유형으로 선언하면 컴파일러는 해당 유형의 값 (또는 해당 유형의 하위 유형 인 값) 만 할당되도록합니다.

당신이 준 ( int, array, double) 예제 는 모두 원시적이며 하위 유형이 없습니다. 따라서 변수를 다음과 같이 선언하면 int:

int x;

당신은 그것이 int가치를 가질 것이라고 확신 할 수 있습니다 .

List그러나 변수를로 선언 한 경우 변수가의 하위 유형을 보유 할 수 있습니다 List. 이들의 예로는 ArrayList, LinkedList

당신이있는 한 경우 List변수를, 당신은 그것이이었다 알고하는 데 필요한 ArrayList다음 작업을 수행 할 수 있습니다 :

List y;
...
if (y instanceof ArrayList) {
  ...its and ArrayList...
}

그러나 그렇게해야한다고 생각한다면 접근 방식을 재고 해 보는 것이 좋습니다. 대부분의 경우 객체 지향 원칙을 따르면이 작업을 수행 할 필요가 없습니다. 물론 모든 규칙에는 예외가 있습니다.


답변

Java의 메소드 과부하 기능을 남용하여 실제로 테스터를 롤링하기가 매우 쉽습니다. SDK에 공식적인 방법이 있는지 여전히 궁금합니다.

예:

class Typetester {
    void printType(byte x) {
        System.out.println(x + " is an byte");
    }
    void printType(int x) {
        System.out.println(x + " is an int");
    }
    void printType(float x) {
        System.out.println(x + " is an float");
    }
    void printType(double x) {
        System.out.println(x + " is an double");
    }
    void printType(char x) {
        System.out.println(x + " is an char");
    }
}

그때:

Typetester t = new Typetester();
t.printType( yourVariable );


답변

a.getClass().getName()-에서 참조하는 실제 객체의 데이터 유형을 제공 a하지만 변수 a가 원래 선언되었거나 이후에 캐스팅 된 데이터 유형은 제공하지 않습니다 .

boolean b = a instanceof String-에서 참조하는 실제 객체 a가 특정 클래스의 인스턴스 인지 여부를 알려줍니다 . 다시 말하지만, 변수 a가 원래 선언되었거나 이후에 캐스팅 된 데이터 유형 은 instanceof 연산자의 결과와 관련이 없습니다.

이 정보는 다음에서 가져 왔습니다.
Java에서 변수 유형을 어떻게 알 수 있습니까?

이것은 일어날 수 있습니다. 나는 Stringint로 구문 분석 Integer.parseInt(s.substring(a, b))하려고하는데 그것을 요약하기 전에 int 또는 쓰레기를 쫓아 내는지 알고 싶습니다 .

그건 그렇고, 이것은 Reflection으로 알려져 있습니다. 주제에 대한 추가 정보는 다음과 같습니다. http://docs.oracle.com/javase/tutorial/reflect/


답변

int 대신 Integer, double 대신 Double 등으로 작업 할 수 있습니다 (이러한 클래스는 모든 기본 유형에 대해 존재합니다). 그런 다음 instanceof 연산자를 사용할 수 있습니다.if(var instanceof Integer){...}


답변

다음을 사용하십시오.

.getClass().getSimpleName();

예:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

산출:

StringBuilder


답변

글쎄, 변수의 유형을 확인하는 것은 이렇게 할 수 있다고 생각합니다.

public <T extends Object> void checkType(T object) {
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

이렇게하면 오버로드 된 메서드가 여러 개 필요하지 않습니다. 추가 된 이점으로 인해 배열보다 컬렉션을 사용하는 것이 좋습니다. 그래도 배열 유형을 확인하는 방법을 모르겠습니다. 누군가가이 솔루션을 개선 할 수 있습니다. 도움이 되었기를 바랍니다!

추신 예, 이것이 기본 요소도 확인하지 않는다는 것을 알고 있습니다.


답변

질문의 첫 번째 부분은 의미가 없습니다. 컴파일 타임에 기본 변수의 유형을 모르는 상황은 없습니다.

두 번째 부분에서 변수가 배열인지 여부를 아직 알지 못하는 유일한 상황은 객체 인 경우입니다. 어떤 경우에 object.getClass().isArray()알려줄 것입니다.