Как определить примитивный тип примитивной переменной?
Есть ли в Java функция, аналогичная <code>typeof</code>
, которая возвращает тип переменной примитивного типа данных (Primitive Data Type, PDT) или выражения операндов примитивных типов?
Кажется, что <code>instanceof</code>
работает только для классов.
2 ответ(ов)
Вы можете использовать следующий класс для определения типа данных в Java:
class TypeResolver
{
public static String Long = "long";
public static String Int = "int";
public static String Float = "float";
public static String Double = "double";
public static String Char = "char";
public static String Boolean = "boolean";
public static String Short = "short";
public static String Byte = "byte";
public static void main(String[] args)
{
//все возвращают true
TypeResolver resolver = new TypeResolver();
System.out.println(resolver.getType(1) == TypeResolver.Int);
System.out.println(resolver.getType(1f) == TypeResolver.Float);
System.out.println(resolver.getType(1.0) == TypeResolver.Double);
System.out.println(resolver.getType('a') == TypeResolver.Char);
System.out.println(resolver.getType((short) 1) == TypeResolver.Short);
System.out.println(resolver.getType((long) 1000) == TypeResolver.Long);
System.out.println(resolver.getType(false) == TypeResolver.Boolean);
System.out.println(resolver.getType((byte) 2) == TypeResolver.Byte);
}
public String getType(int x)
{
return TypeResolver.Int;
}
public String getType(byte x)
{
return TypeResolver.Byte;
}
public String getType(float x)
{
return TypeResolver.Float;
}
public String getType(double x)
{
return TypeResolver.Double;
}
public String getType(boolean x)
{
return TypeResolver.Boolean;
}
public String getType(short x)
{
return TypeResolver.Short;
}
public String getType(long x)
{
return TypeResolver.Long;
}
public String getType(char x)
{
return TypeResolver.Char;
}
}
Этот класс TypeResolver
позволяет определить тип (например, int
, float
, double
, и т.д.) на основе переданного аргумента. Методы getType
перегружены для различных типов данных, и в методе main
можно увидеть примеры использования, где проверяется, корректно ли распознается тип по значению. Все проверки возвращают true
, что подтверждает правильность работы класса.
В вашем коде вы используете два способа, чтобы определить тип примитивного типа int
. Давайте рассмотрим оба метода.
package com.company;
public class Testing {
public static void main(String[] args) {
int x;
x = 0;
// Первый метод
System.out.println(((Object)x).getClass().getName());
if (((Object)x).getClass().getName() == "java.lang.Integer") {
System.out.println("i am int");
}
// Второй метод, который вернет true или false
System.out.println(Integer.class.isInstance(x));
}
}
Первый способ: вы приводите примитивный тип int
к объекту Object
, а затем вызываете метод getClass()
и getName()
, чтобы получить имя класса. Однако здесь есть ошибка в сравнении строк, так как рекомендуется использовать метод .equals()
вместо ==
для сравнения строк в Java. Так что выражение ((Object)x).getClass().getName() == "java.lang.Integer"
нужно заменить на ((Object)x).getClass().getName().equals("java.lang.Integer")
.
Второй способ: метод Integer.class.isInstance(x)
проверяет, является ли объект экземпляром указанного класса Integer
. Однако, так как x
- это примитивный тип int
, метод isInstance()
всегда вернет false
, так как примитивные типы не являются объектами.
Если вы хотите определить тип примитивного типа, вам стоит рассмотреть возможность обернуть его в объектный класс, например, Integer
. Например:
Integer wrappedX = x; // Автоупаковка
System.out.println(wrappedX.getClass().getName()); // Это вернет "java.lang.Integer"
Или использовать instanceof
на объекте:
if (wrappedX instanceof Integer) {
System.out.println("i am int");
}
Таким образом, правильный подход к определению типа примитивного типа в Java заключается в обертывании примитивного типа в соответствующий объектный класс и использовании методов, которые работают с объектами, вместо прямой работы с примитивами.
Инициализация ArrayList в одну строчку
Что значит 'synchronized'?
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Какие проблемы следует учитывать при переопределении equals и hashCode в Java?