كيفية الحصول على معلومات النوع العامة من getAnnotatedParameterTypes() في Java 8؟

StackOverflow https://stackoverflow.com//questions/23025363

سؤال

انها تبدو مثل getAnnotatedParameterTypes() إرجاع مجموعة من AnnotatedTypeتحتوي على أنواع خام، وليست عامة.على سبيل المثال:

public <T> void genericMethod(T t) {
}

@Test
public void testAnnotatedTypes() throws ReflectiveOperationException {
    Method method = getClass().getMethod("genericMethod", Object.class);

    Type type = method.getGenericParameterTypes()[0];
    assertTrue(type instanceof TypeVariable);

    AnnotatedType annotatedType = method.getAnnotatedParameterTypes()[0];

    // This fails; annotatedType implements only AnnotatedType
    assertTrue(annotatedType instanceof AnnotatedTypeVariable);

    // This fails too; type is a TypeVariable while annotatedType.getType() is
    // Object.class
    assertEquals(type, annotatedType.getType());
}

ما سبب الخلاف مع getGenericParameterTypes()?

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

المحلول

هناك تقرير الشوائب حول هذا, ، وتم إصلاحه منذ ذلك الحين.

هناك فرق بين Method#getGenericParameterTypes() و Method#getAnnotatedParameterTypes().

الأول يقدم ضمانات بشأن الأنواع التي يعيدها

إذا كان نوع المعلمة الرسمي هو نوع محدد ، فيجب أن يعكس كائن النوع الذي تم إرجاعه بدقة معلمات النوع الفعلي المستخدمة في الكود المصدر.

إذا كان نوع المعلمة الرسمي هو متغير نوع أو نوع محدد ، يتم إنشاؤه.وبخلاف ذلك يتم حلها.

بينما الأخير لا يفعل ذلك، ليس بشكل واضح على الأقل:

إرجاع مجموعة من AnnotatedType الكائنات التي تمثل استخدام الأنواع لتحديد أنواع المعلمات الرسمية للطريقة/المنشئ الممثلة في هذا Executable.

علينا أن نفترض ذلك getAnnotatedParameterTypes() إرجاع الأنواع المحذوفة (على الرغم من أنه ربما لم يكن المقصود بهذه الطريقة).متغير النوع غير المحدود T تم مسحه ل Object.إذا كان لديك <T extends Foo>, ، سيتم محوها ل Foo.

أما بالنسبة للتعليقات، بخصوص الحصول على التعليق التوضيحي من وسيطة النوع في معلمة الطريقة، فلا توجد طريقة في ضوء ما ورد أعلاه.قد يظن المرء أنه يعمل كما هو الحال في الحقول.

public static void main(String[] args) throws Exception {
    Field field = Example.class.getField("field");
    AnnotatedParameterizedType annotatedParameterizedType = (AnnotatedParameterizedType) field
            .getAnnotatedType();

    System.out.println(annotatedParameterizedType
            .getAnnotatedActualTypeArguments()[0].getType());
    System.out.println(Arrays.toString(annotatedParameterizedType
            .getAnnotatedActualTypeArguments()[0].getAnnotations()));
}

@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.TYPE_USE })
@interface Bar {
}

public List<@Bar String> field;

الذي يطبع

class java.lang.String
[@com.example.Example$Bar()]

أعتقد بشدة أن هذا خطأ يحتاج إلى إصلاح، وسوف أتبع تقرير الخطأ المرتبط أعلاه.

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