내 변수가 int, array, double 등인지 어떻게 확인할 수 있습니까?
편집 : 예를 들어, 변수가 배열인지 어떻게 확인할 수 있습니까? 이를 수행하는 기능이 있습니까?
내 변수가 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
randSBNULL을 보유 하면 작동하지 않는다는 점에 유의하십시오 .
글쎄, 변수의 유형을 확인하는 것은 이렇게 할 수 있다고 생각합니다.
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()알려줄 것입니다.
나는 그것을 사용하여했다 : if(x.getClass() == MyClass.class){...}
나는이 답변들 중 어느 것도 만족스럽지 않았고, 옳은 답변은 설명과 반대표가 없기 때문에 주변을 검색하고 몇 가지를 찾아서 이해하기 쉽도록 편집했습니다. 바라는 것만 큼 솔직하지 말고 그것을 가지고 놀아 라.
//move your variable into an Object type
Object obj=whatYouAreChecking;
System.out.println(obj);
// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);
// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);
방법은 다음과 같습니다.
public static void checkClass (Object obj) {
Class cls = obj.getClass();
System.out.println("The type of the object is: " + cls.getSimpleName());
}
변수가 초기화되지 않은 제네릭 유형이면 이러한 답변 중 어느 것도 작동하지 않습니다.
그리고 내가 찾을 수있는 것은 매우 추한 해결 방법 을 사용하거나 초기화 된 매개 변수를 함수에 전달하여 제자리에 만드는 방법으로 만 가능 합니다. 여기를 참조하세요.
<T> T MyMethod(...){ if(T.class == MyClass.class){...}}
T런타임에 지워 지므로 매개 변수 에서 유형을 직접 가져올 수 없으므로 유효하지 않습니다 .
<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}
이것은 호출자가 out호출하기 전에 변수를 인스턴스화 할 책임이 있기 때문에 작동합니다 . 호출시 out이 null 인 경우에도 예외가 발생하지만 연결된 솔루션과 비교하면 이것이 가장 쉬운 방법입니다.
나는 이것이 일종의 특정 응용 프로그램이라는 것을 알고 있지만 이것이 Java로 변수 유형을 찾는 Google의 첫 번째 결과이기 때문에 T포함되어야한다고 생각합니다.
Java.lang.Class.getSimpleName()변수가 원시 형이 아닌 경우 Method Only를 사용하여 쉽게 확인할 수 있습니다 . 원시 유형 int, long 등에서는 작동하지 않습니다.
기본적으로 예를 들면 다음과 같습니다.
public class Kerem
{
public static void main(String[] args)
{
short x = 10;
short y = 3;
Object o = y;
System.out.println(o.getClass()); // java.lang.Short
}
}