Як я можу перевірити, щоб переконатися, що моя змінна - це int, масив, double та інше ...?
Редагувати: Наприклад, як я можу перевірити, чи є змінною масив? Чи є якась функція для цього?
Як я можу перевірити, щоб переконатися, що моя змінна - це int, масив, double та інше ...?
Редагувати: Наприклад, як я можу перевірити, чи є змінною масив? Чи є якась функція для цього?
Відповіді:
Java - це статично набрана мова, тому компілятор робить більшість цієї перевірки за вас. Після того, як ви визначите змінну певним типом, компілятор переконається, що їй колись присвоюються значення цього типу (або значення, які є підтипами цього типу).
Наведені вами приклади ( int, масив double) - це все примітиви, і їх немає підтипів. Таким чином, якщо ви визначите змінну такою, як int:
int x;
Ви можете бути впевнені, що це буде лише колись intзначення.
Якщо ви оголосили змінну як a 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))виштовхує інт чи сміття, перш ніж спробувати його підбити.
До речі, це відомо як Рефлексія. Ось додаткова інформація з цього питання: http://docs.oracle.com/javase/tutorial/reflect/
Ви можете працювати з Integer замість int, Double замість double та ін. (Такі класи існують для всіх примітивних типів). Тоді ви можете використовувати оператор instanceof, наприкладif(var instanceof Integer){...}
Просто використовуйте:
.getClass().getSimpleName();
Приклад:
StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());
Вихід:
StringBuilder
randSBутримується NULL.
Ну, я думаю, перевірити тип змінної можна так.
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! ");
}
Таким чином, вам не потрібно мати кілька перевантажених методів. Я вважаю, що корисно використовувати колекції над масивами через додаткові переваги. Сказавши це, я не знаю, як перевірити тип масиву. Можливо, хтось може вдосконалити це рішення. Сподіваюся, це допомагає!
PS Так, я знаю, що це також не перевіряє примітивів.
Перша частина вашого питання безглузда. Немає обставин, за яких ви не знаєте тип примітивної змінної під час компіляції.
З другої частини, єдиною обставиною, що ви вже не знаєте, чи є змінною масив, якщо це Об'єкт. У такому випадку 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 перед викликом. Це все одно викине виняток, якщо при виклику немає значення, але порівняно із пов'язаним рішенням, це, безумовно, найпростіший спосіб зробити це
Я знаю, що це свого роду специфічне додаток, але оскільки це перший результат в Google для пошуку типу змінної з java (і враховуючи, що Tце свого роду змінна), я вважаю, що її слід включити
Ви можете легко перевірити це за допомогою Java.lang.Class.getSimpleName() методу Тільки якщо змінна має непомітний тип. Це не працює з примітивними типами int, long і т.д.
посилання - Ось посилання на документи Oracle
В основному, наприклад:
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
}
}