Как проверить тип переменной в Java?

Как я могу проверить, чтобы моя переменная была int, array, double и т.д....?

Изменить: Например, как я могу проверить, что переменная является массивом? Есть ли какая-нибудь функция для этого?

Ответ 1

Java является статически типизированным языком, поэтому большую часть этой проверки за вас выполняет компилятор. После того, как вы объявите переменную определенного типа, компилятор будет гарантировать, что ей будут назначены только значения этого типа (или значения, которые являются подтипами этого типа).

Примеры, которые вы привели (int, массив, double), это все примитивы, и их нет подтипов. Таким образом, если вы объявите переменную как int:

int x;

Вы можете быть уверены, что он будет содержать только значения int.

Однако если вы объявили переменную как List, возможно, что переменная будет содержать подтипы List. Примеры этого включают в себя ArrayList, LinkedList и т.д.

Если у вас есть переменная List и вам необходимо знать, является ли она переменной ArrayList, вы можете сделать следующее:

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

Однако, если вы думаете, что вам нужно сделать это, вы можете пересмотреть свой подход. В большинстве случаев, если вы следуете объектно-ориентированным принципам, вам не нужно это делать. Есть, конечно, исключения из каждого правила.

Ответ 2

На самом деле довольно легко свернуть собственный тестер, злоупотребляя способностью перегрузки 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 );

Ответ 3

a.getClass().getName() - даст вам тип данных фактического объекта, на который ссылается a, но не тип данных, который переменная a была первоначально объявлена как или впоследствии приведена к ней.

boolean b = a instanceof String - сообщит вам, является ли фактический объект, на который ссылается a экземпляром определенного класса. Опять же, тип данных, который переменная a была первоначально объявлена как или впоследствии приведена, не имеет никакого отношения к результату оператора instanceof.

Я взял эту информацию от: Как вы знаете тип переменной в Java?

Это может случиться Я пытаюсь разобрать String в int, и я хотел бы знать, если мой Integer.parseInt(s.substring(a, b)) выбрасывает int или мусор, прежде чем я Integer.parseInt(s.substring(a, b)) итоги.

Кстати, это известно как отражение. Вот еще немного информации по этому вопросу: http://docs.oracle.com/javase/tutorial/reflect/

Ответ 4

Вы можете работать с Integer вместо int, Double вместо double и т.д. (такие классы существуют для всех примитивных типов). Затем вы можете использовать оператор instanceof, например if(var instanceof Integer){...}

Ответ 5

Хорошо, я думаю, что проверка типа переменной может быть выполнена таким образом.

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! ");
}

Таким образом, вам не нужно иметь несколько перегруженных методов. Я считаю хорошей практикой использовать коллекции по массивам из-за дополнительных преимуществ. Сказав это, я не знаю, как проверить тип массива. Может быть, кто-то может улучшить это решение. Надеюсь это поможет!

P.S Да, я знаю, что это также не проверяет примитивы.

Ответ 6

Просто используйте:

.getClass().getSimpleName();

Пример:

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

Выход:

StringBuilder

Ответ 7

Первая часть вашего вопроса бессмысленна. Нет никаких обстоятельств, при которых вы не знаете тип примитивной переменной во время компиляции.

Повторите вторую часть, единственное, что вы еще не знаете, является ли переменная массивом, является ли это объектом. В этом случае object.getClass().isArray() расскажет вам.

Ответ 8

Я сделал это, используя: if(x.getClass() == MyClass.class){...}

Ответ 9

Я не был доволен ни одним из этих ответов, и тот, у которого нет прав, не имеет объяснений и отрицательных голосов, поэтому я искал вокруг, нашел кое-что и отредактировал его, чтобы его было легко понять. Поиграйте с ним, не так прямо, как хотелось бы.

//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());       
}

Ответ 10

Ни один из этих ответов не работает, если переменная является неинициализированным универсальным типом

И из того, что я могу найти, это возможно только с использованием крайне уродливого обходного пути или путем передачи инициализированного параметра в вашу функцию, делая его на месте, смотрите здесь:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

НЕДОПУСТИМО, поскольку вы не можете напрямую извлечь тип из параметра T, поскольку он стирается во время выполнения.

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

Это работает, потому что вызывающий абонент отвечает на инстанцировании переменную out перед вызовом. Это все равно будет выдавать исключение, если при вызове out is null, но по сравнению со связанным решением, это, безусловно, самый простой способ сделать это

Я знаю, что это своего рода конкретное приложение, но так как это первый результат в Google для поиска типа переменной с Java (и учитывая, что T является разновидностью переменной), я чувствую, что это должно быть включено

Ответ 11

Вы можете легко проверить это, используя Java.lang.Class.getSimpleName() только если переменная имеет не примитивный тип. Он не работает с примитивными типами int, long и т.д.

ссылка - вот ссылка на документацию Oracle

Ответ 12

открытый класс Demo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}