تحقق من نوع المجال البدائي
-
19-09-2019 - |
سؤال
أحاول تحديد نوع الحقل على كائن. لا أعرف نوع الكائن عندما يتم تمريره إلي، لكنني بحاجة إلى العثور على الحقول التي هي long
س. من السهل بما يكفي للتمييز Long
S ولكن البدائية 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 سؤال