есть ли способ проверить instanceof примитивов переменных java
Мы можем узнать, что ссылка на объект-это тест, используя оператор instanceof. Но есть ли оператор для проверки примитивных типов? Например:
byte b = 10;
Теперь, если я только рассмотрю значение 10
. Есть ли способ узнать, что он был объявлен как байт?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
И т. д...