0

Как определить примитивный тип примитивной переменной?

80

Есть ли в Java функция, аналогичная <code>typeof</code>, которая возвращает тип переменной примитивного типа данных (Primitive Data Type, PDT) или выражения операндов примитивных типов?

Кажется, что <code>instanceof</code> работает только для классов.

2 ответ(ов)

0

Вы можете использовать следующий класс для определения типа данных в 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, что подтверждает правильность работы класса.

0

В вашем коде вы используете два способа, чтобы определить тип примитивного типа 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 заключается в обертывании примитивного типа в соответствующий объектный класс и использовании методов, которые работают с объектами, вместо прямой работы с примитивами.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь