سؤال

أحاول تحديد نوع الحقل على كائن. لا أعرف نوع الكائن عندما يتم تمريره إلي، لكنني بحاجة إلى العثور على الحقول التي هي longس. من السهل بما يكفي للتمييز LongS ولكن البدائية long يبدو أكثر صعوبة.

أنا تستطيع تأكد من أن الكائنات مرت لي فقط Longs, وليس البدائيات، لكنني أفضل ذلك. إذن ما لدي هو:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class)) {
        // found one -- I don't get here for primitive longs
    }
}

طريقة اختراق، والتي يبدو أنها تعمل، هي:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    if (clazz.equals(Long.class) ||  clazz.getName().equals("long")) {
        // found one
    }
}

أود حقا طريقة نظافة للقيام بذلك إذا كان هناك واحد. إذا لم يكن هناك طريقة أفضل، فأنا أعتقد أن تتطلب الكائنات التي أتلقاها لاستخدامها فقط Long (ليس long) سيكون أفضل واجهة برمجة تطبيقات أفضل.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

أنت تستخدم ثابتا خاطئا للتحقق من البدائيات الطويلة - استخدم Long.TYPE, ، يمكن العثور على كل نوع بدائي آخر مع ثابت مسمى بالمثل على المجمع. على سبيل المثال: Byte.TYPE, Character.TYPE, ، إلخ.

نصائح أخرى

o.getClass().getField("fieldName").getType().isPrimitive();

يمكنك فقط استخدام

boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class

إذا كنت تستخدم انعكاس، فلماذا تهتم، لماذا يحدث هذا على الإطلاق. تستخدم أساليب Get / Set دائما الكائنات حتى لا تحتاج إلى معرفة ما إذا كان الحقل نوع بدائي (ما لم تحاول ضبط نوع بدائي إلى القيمة الخالية.)

في الواقع، للحصول على الطريقة التي تحصل عليها ()، لا تحتاج إلى معرفة أي نوع. يمكنك ان تفعل

// any number type is fine.
Number n = field.get(object);
long l = n.longValue();

إذا لم تكن متأكدا مما إذا كان نوع رقم يمكنك القيام به

Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
     Number n = (Number) o;
     long l = n.longValue();
  • للكشف عن الحقول مع long اكتب استخدام long.class أو Long.TYPE.

  • للكشف عن الحقول مع Long اكتب استخدام Long.class.

مثال:

for (Field f : o.getClass().getDeclaredFields()) {
    Class<?> clazz = f.getType();
    // to detect both Long and long types
    if (Long.class.equals(clazz) || long.class.equals(clazz)) {
        // found one
    }
}

تنويه:

Long.TYPE هو عضو ثابت ثابت وهو ما يعادل long.class.

نموذج مقتطف نموذج Long فصل

/**
 * The {@link Class} object that represents the primitive type {@code long}.
 */
@SuppressWarnings("unchecked")
public static final Class<Long> TYPE
        = (Class<Long>) long[].class.getComponentType();

تحقق أيضا من أجل إجابه ل الفرق بين Integer.Class و InteGer.Type سؤال

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top