Определение, имеет ли Объект тип примитива

Вы должны будете использовать CPU, который поддерживает набор команд SSE4.2; например. Nehalem или новее - иначе вы можете запускать только x86 изображения, что идеально подходит для тестирования. Я использую их по соображениям производительности, даже если бы смог запустить x86_64 изображения. ARM64 аппаратное обеспечение - это то, что на самом деле имеет значение для тестирования в наши дни.

Этот вопрос, вероятно, должен раскрыть, какой CPU вы даже используете, который может быть устаревшим CPU, учитывая дату первоначального выпуска архитектуры Nehalem, которая представила SSE4.2.

Для справки: Intel .

108
задан drill3r 2 April 2009 в 14:36
поделиться

9 ответов

Типы в Object[] действительно никогда не будет примитивно - потому что у Вас есть ссылки! Здесь тип i int тогда как тип объекта, на который ссылаются o Integer (из-за автоупаковки).

Это кажется, что необходимо узнать, является ли тип "оберткой для примитивного". Я не думаю, что существует что-либо встроенное в стандартные библиотеки для этого, но легко кодировать:

import java.util.*;

public class Test
{
    public static void main(String[] args)        
    {
        System.out.println(isWrapperType(String.class));
        System.out.println(isWrapperType(Integer.class));
    }

    private static final Set<Class<?>> WRAPPER_TYPES = getWrapperTypes();

    public static boolean isWrapperType(Class<?> clazz)
    {
        return WRAPPER_TYPES.contains(clazz);
    }

    private static Set<Class<?>> getWrapperTypes()
    {
        Set<Class<?>> ret = new HashSet<Class<?>>();
        ret.add(Boolean.class);
        ret.add(Character.class);
        ret.add(Byte.class);
        ret.add(Short.class);
        ret.add(Integer.class);
        ret.add(Long.class);
        ret.add(Float.class);
        ret.add(Double.class);
        ret.add(Void.class);
        return ret;
    }
}
161
ответ дан Hearen 24 November 2019 в 03:26
поделиться

primitve типы обертки не ответят на это значение. Это для представления класса примитивов, хотя кроме отражения я не могу думать о слишком многих использовании для него бесцеремонно. Так, например

System.out.println(Integer.class.isPrimitive());

печать "ложь", но

public static void main (String args[]) throws Exception
{
    Method m = Junk.class.getMethod( "a",null);
    System.out.println( m.getReturnType().isPrimitive());
}

public static int a()
{
    return 1;
}

"верная" печать

2
ответ дан Steve B. 24 November 2019 в 03:26
поделиться

Как несколько человек уже сказали, это происходит из-за автоупаковки.

Вы могли создать служебный метод проверить, является ли класс объекта Integer, Double, и т.д., Но нет никакого способа знать, был ли объект создан путем автоупаковки примитива; после того как это упаковывается, это смотрит точно так же, как объект создал явно.

Таким образом, если Вы не знаете наверняка, что Ваш массив никогда не будет содержать класс обертки без автоупаковки, нет никакого действительного решения.

2
ответ дан Michael Myers 24 November 2019 в 03:26
поделиться

Необходимо иметь дело с автоупаковкой Java.
Давайте возьмем код

public class test
{
    public static void main(String [ ] args)
    {
        int i = 3;
        Object o = i;
        return;
    }
}
Вы получаете класс test.class и javap-c тест, позвольте нам, Вы осматриваете сгенерированный байт-код.
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   return

public static void main(java.lang.String[]); Code: 0: iconst_3 1: istore_1 2: iload_1 3: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 6: astore_2 7: return

}

Поскольку Вы видите добавленный компилятор Java
invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
создать новое Целое число из Вашего интервала и затем хранит тот новый Объект в o через astore_2
5
ответ дан chendral 24 November 2019 в 03:26
поделиться

Именно так Вы видите, что это, возможно для isPrimitive возвратить true (так как у Вас есть достаточно ответов, показывающих Вам, почему это - ложь):

public class Main
{
    public static void main(final String[] argv)
    {
        final Class clazz;

        clazz = int.class;
        System.out.println(clazz.isPrimitive());
    }
}

Это имеет значение в отражении, когда метод берет в "интервале", а не "Целом числе".

Этот код работы:

import java.lang.reflect.Method;

public class Main
{
    public static void main(final String[] argv)
        throws Exception
    {
        final Method method;

        method = Main.class.getDeclaredMethod("foo", int.class);
    }

    public static void foo(final int x)
    {
    }
}

Эти сбои кода (не может найти метод):

import java.lang.reflect.Method;

public class Main
{
    public static void main(final String[] argv)
        throws Exception
    {
        final Method method;

        method = Main.class.getDeclaredMethod("foo", Integer.class);
    }

    public static void foo(final int x)
    {
    }
}
3
ответ дан TofuBeer 24 November 2019 в 03:26
поделиться

Я думаю, что это происходит из-за автоупаковки.

int i = 3;
Object o = i;
o.getClass().getName(); // prints Integer

Можно реализовать служебный метод, который соответствует этим определенным классам упаковки и дает Вам, если определенный класс примитивен.

public static boolean isWrapperType(Class<?> clazz) {
    return clazz.equals(Boolean.class) || 
        clazz.equals(Integer.class) ||
        clazz.equals(Character.class) ||
        clazz.equals(Byte.class) ||
        clazz.equals(Short.class) ||
        clazz.equals(Double.class) ||
        clazz.equals(Long.class) ||
        clazz.equals(Float.class);
}
5
ответ дан bruno conde 24 November 2019 в 03:26
поделиться

Integer не примитив, Class.isPrimitive() не лежит.

6
ответ дан Bombe 24 November 2019 в 03:26
поделиться

При запуске в Java 1.5 и, существует названная автоупаковка новой возможности. Компилятор делает это само. Когда это видит возможность, это преобразовывает тип примитива в свой соответствующий класс обертки.

Что, вероятно, происходит, вот, когда Вы объявляете

Object o = i;

Компилятор скомпилирует этот оператор что

Object o = Integer.valueOf(i);

Это автоупаковывает. Это объяснило бы вывод, который Вы получаете. Эта страница от спецификации Java 1.5 объясняет автоупаковку больше подробно.

8
ответ дан Zordid 24 November 2019 в 03:26
поделиться

Для тех, кому нравится краткий код.

private static final Set<Class> WRAPPER_TYPES = new HashSet(Arrays.asList(
    Boolean.class, Character.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Void.class));
public static boolean isWrapperType(Class clazz) {
    return WRAPPER_TYPES.contains(clazz);
}
16
ответ дан Peter Lawrey 24 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: