[英]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.