есть ли способ проверить instanceof примитивов переменных java


Мы можем узнать, что ссылка на объект-это тест, используя оператор instanceof. Но есть ли оператор для проверки примитивных типов? Например:

byte b = 10;
Теперь, если я только рассмотрю значение 10. Есть ли способ узнать, что он был объявлен как байт?
3 4

3 ответа:

Локальные переменные

Предполагая, что вы подразумеваете под локальными переменными примитив всегда будет автоматически обернут его типом оболочки всякий раз, когда он передается как объект, java.яз..Байт в данном случае. Невозможно ссылаться на локальные переменные с помощью отражения, поэтому вы не можете различать байт и Байт, целое число и int и т. д.

Object bytePrimitive = (byte) 10;

System.out.println("is a Byte ?   " + (bytePrimitive instanceof Byte));
System.out.println("Check class = " + (bytePrimitive.getClass()));

// false because class in this case becomes Byte, not byte.
System.out.println("Primitive = " + (bytePrimitive .getClass().isPrimitive()));

Поля

Однако, если вы говорите о полях в классах, то все обстоит иначе, поскольку вы можете справиться с фактическими объявляемый тип. Затем вы можете использовать java.яз..Класс.isPrimitive (), как и ожидалось, и тип будет byte.класс.

public class PrimitiveMadness {
    static byte bytePrimitiveField;
    static Byte byteWrapperField;

    public static void main(String[] args) throws Exception {
        System.out.println("Field type  =     " + PrimitiveMadness.class.getDeclaredField("bytePrimitiveField").getType());
        System.out.println("Is a byte   =     " + (PrimitiveMadness.class.getDeclaredField("bytePrimitiveField").getType() == byte.class));
        System.out.println("Is a primitive? = " + PrimitiveMadness.class.getDeclaredField("bytePrimitiveField").getType().isPrimitive());
        System.out.println("Wrapper field   = " + PrimitiveMadness.class.getDeclaredField("byteWrapperField").getType());
    }

}

Если вы действительно хотите играть с литералами...

    if(Byte.class.isInstance(10)) {
        System.out.println("I am an instance of Byte");         
    }
    if(Integer.class.isInstance(10)) {
        System.out.println("Ups, I can also act as an instance of Integer");            
    }
    if(false == Float.class.isInstance(10)) {
        System.out.println("At least I am not a float or double!");         
    }
    if(false == Byte.class.isInstance(1000)) {
        System.out.println("I am too big to be a byte");            
    }
byte b = 10;
Object B= b;
 if (B.getClass() == Byte.class) {
  System.out.println("Its a Byte");
 }

Примечание: байт является конечным, поэтому instanceof эквивалентен равенству классов.

Теперь, если вы попробуете:

Object ref = 10;
System.out.println(ref.getClass()); //class java.lang.Integer

Object ref = 10.0;
System.out.println(ref.getClass()); //class java.lang.Double

Object ref = 10L;
System.out.println(ref.getClass()); //class java.lang.Long

И т. д...