簡體   English   中英

如何給一個論證課 <?> 上課

[英]How to give an argument Class<?> to Class<A>

在下面的代碼中,我分析了一個給定的包,以使用給定的注解對所有類進行注解。

我想將它們及其注釋(及其值)加載到Map中。

package com.test

@Named("valueToStock")
public class Main {
    @SneakyThrows
    @SuppressWarnings("unchecked")
    public static  ImmutableMap<Class<? extends Annotation>, Class<?>> find(Class<? extends Annotation> annotation, String packageBase) {
        final ClassLoader loader = Thread.currentThread().getContextClassLoader();

        return ClassPath.from(loader).getTopLevelClassesRecursive(packageBase).stream()
                .filter(x -> x.load().getAnnotation(annotation) != null)
                .collect(Collectors.collectingAndThen(Collectors
                        .toMap(x -> x.load().getAnnotation(annotation), x-> x.load()), ImmutableMap::copyOf));
    }

    public static void main(String[] args) {
        find(Named.class, "com.test")
            .forEach((x, y) -> System.out.println(String.format("Class: %s, Annotation: %s", y, x)));
    }
}

我的問題:當我嘗試調用x.load().getAnnotation(annotation);

圖片

我嘗試刪除extends Annotation ,但它不起作用,也找不到其他方法。

編輯:也嘗試了

public static <A extends Annotation> ImmutableMap<Class<A>, Class<?>> find(Class<A> annotation, String packageBase) {
    final ClassLoader loader = Thread.currentThread().getContextClassLoader();

    return ClassPath.from(loader).getTopLevelClassesRecursive(packageBase).stream()
            .filter(x -> x.load().getAnnotation(annotation) != null)
            .collect(Collectors.collectingAndThen(Collectors
                    .toMap(x -> x.load().getAnnotation(annotation), x-> x.load()), ImmutableMap::copyOf));
}

並且仍然存在以下錯誤(與編譯時相同):

圖片

編輯:
解決我的問題后,我發現了另一個錯誤。 注釋實例必須是map的值,而不是鍵;)Pce

您需要引入一個命名類型變量。 否則,編譯器將無法知道這兩個通配符類型應為同一類型。

例如:

public static <T extends Annotation>
    ImmutableMap<Class<T>, Class<?>> find(
        Class<T> annotation, String packageBase) {

編輯 :您還將混淆注釋類型與注釋實例 Class.getAnnotation(Class<A>)返回A ,而不是Class<A>

您可能希望返回以注釋實例為鍵的地圖(例如ImmutableMap<A, Class<?>> )。 如果您確實希望將Class<A>對象作為鍵,則不需要getAnnotation 只需使用x.load().hasAnnotation(annotation) ? annotation : null x.load().hasAnnotation(annotation) ? annotation : null或等效的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM