Java에서 변수 유형을 어떻게 알 수 있습니까?


152

변수를 선언한다고 가정 해 봅시다.

String a = "test";

그리고 나는 그것이 어떤 유형인지 알고 싶습니다. 즉, 출력은 java.lang.String어떻게해야합니까?


1
변수유형에 정말로 관심이 있습니까? 아니면 유형에 관심이 있습니까? 변수의 유형을 쉽게 얻을 수 없기 때문에 (실제로 지역 변수에는 불가능하며 필드에 대한 반영이 필요합니다).
Joachim Sauer

8
@Paul : 고려 Object o = "o";-변수의 유형은 Object이고 값의 유형은 String입니다.
Michael Borgwardt

2
@Paul In List<String> l = new ArrayList<String>();에서 변수 List<String>의 유형은이고 값의 유형은입니다 ArrayList<String>.
벤 링

1
@Ben Lings 변수 유형은 java.util.ArrayList이고 값 유형은 java.util.ArrayList입니다.
Ajay Takur

1
@AjayThakur-컴파일 타임 (정적) 유형과 런타임 (동적) 유형의 차이점입니다.
Ben Lings

답변:


269
a.getClass().getName()

16
그것은 가치의 유형을 줄 것입니다. 반드시 변수의 유형이 아닙니다.
Joachim Sauer

7
방금 a컴파일 타임에 선언이 분명 하기 때문에 OP가 실제로 찾고 있던 것이라 생각했습니다
Martin

4
유형이 기본이 아닌 경우 작동합니다 ... 유형이 int 인 경우 유형을 아는 방법은 무엇입니까?
Miguel Ribeiro

5
@Miguel : int값을 처리 할 수있는 유일한 방법 은 int변수에 있기 때문에 int값 을 처리하고 해당 유형을 모르는 코드를 작성할 수있는 방법 이 없습니다 . 와 같은 래퍼를 처리하는 경우 문제가 다르지만 Integer이 답변의 코드가 다시 작동합니다.
Joachim Sauer

1
이것은 기본 유형에는 해당되지 않습니다.
Mehdi

37

이름을 원하면 Martin의 방법을 사용하십시오. 특정 클래스의 인스턴스인지 알고 싶다면 :

boolean b = a instanceof String


15
마틴도 아닌가요? :)
seokhoonlee

다른 마틴 ... LOL은)
chankruze

Thic 코드 Double a = 1d; boolean b = a instanceof String;는 오류를 일으킬 것입니다error: incompatible types: Double cannot be converted to String
Alex78191

35

나는 거기에 Martin의 대답을 확장하고 싶습니다 ...

어떤 "변수 유형이"그런 식으로 인쇄 할 수 있도록 그의 해결책은 오히려 좋은이지만, 불통 될 수있다. (그것은, 실제로 값 유형의 더 많은 주제에 ). 즉, "비틀어 짐"은 이에 대한 강력한 단어 일 수 있습니다. 어쨌든 도움이 될 수 있습니다.

마틴 솔루션 :

a.getClass().getName()

그러나 무엇이든 작동하려면 다음을 수행하십시오.

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

이 경우, 기본 요소는 랩퍼로 랩핑됩니다. 이 경우 기본 객체를 얻을 수 있습니다.

나는 이것을 다음과 같이 사용했다.

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

제네릭 사용하기 :

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

흥미 롭군 방금 코드를 시험해 보았습니다. System.out.println (((Object) Integer.parseInt ( "12")) .getClass (). getSimpleName ()); 그리고 작동합니다! \ o /
shevy

31

검색 엔진에서 배웠습니다 (영어가 매우 나쁩니다. 그래서 코드 ...) 변수 유형을 얻는 방법은 무엇입니까? 업 :

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

이 방법 :

str.getClass().getSimpleName();
value:String

이제 예 :

Object o = 1;
o.getClass().getSimpleName();
value:Integer

3

변수가 클래스 속성이 아닌 한 Joachim Sauer가 말한 것에 동의하지 않습니다 (변수 유형! 값 유형이 아닙니다!). (클래스 필드를 검색하고 이름으로 올바른 필드를 가져와야합니다 ...)

실제로 나를 a.xxx().yyy()위해이 메서드를 호출하는 컨텍스트에 따라 정확히 동일한 객체에서 답변이 다르기 때문에 모든 메서드가 올바른 답변을 제공 하는 것은 완전히 불가능합니다 ...

teehoo가 말했듯이, 테스트 할 정의 된 유형 목록을 컴파일하면 instanceof를 사용할 수 있지만 서브 클래스가 true를 반환하게됩니다 ...

가능한 해결책 중 하나는 구현에서 스스로 영감을 얻고 자신 java.lang.reflect.FieldField클래스를 만든 다음 모든 로컬 변수를이 사용자 정의 Field구현 으로 선언하는 것입니다 ...하지만 다른 솔루션을 찾는 것이 더 좋습니다. 왜 변수가 필요한지 궁금합니다. 값 유형뿐만 아니라 유형?


들어 "하지만 당신은 또한 사실 돌아 서브 클래스를 얻을 것이다 ..." , 나는 당신이 의미 생각 "하지만 당신은 또한 사실 반환 부모 클래스를 얻을 것이다 ..." , 맞죠?
skomisa

3

Java의 연산자 오버로드 기능 사용

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}

8
자바 연산자 오버로딩의 개념이없는,이 메소드 오버로딩이다
nicoschl

2

여기에 여러 솔루션이 있다고 생각합니다.

  • 의 인스턴스는 솔루션이 될 수 있습니다.

왜? Java에서는 모든 클래스가 Object 클래스 자체에서 상속됩니다. 따라서 변수가 있고 그 유형을 알고 싶다면 당신이 사용할 수있는

  • System.out.println (((Object) f) .getClass (). getName ());

또는

  • Integer.class.isInstance (1985); // 사실을 준다

또는

  • isPrimitive ()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

이것은 우리에게 줄 것이다 :

  1. 그릇된
  2. 진실

자세한 내용은 여기를 찾아 : 어떻게 원시적 변수의 기본 유형을 확인하려면?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.