Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将java泛型从方法应用到同一类中的字段_Java - Fatal编程技术网

如何将java泛型从方法应用到同一类中的字段

如何将java泛型从方法应用到同一类中的字段,java,Java,我有一个函数,它提供用给定注释注释的类的映射 void <A extends Annotation> ImmutableMap<Class<?>, A> find(Class<A> annotation, String packageBase) { final ClassLoader loader = Thread.currentThread().getContextClassLoader(); return ClassPath.

我有一个函数,它提供用给定注释注释的类的映射

void <A extends Annotation> ImmutableMap<Class<?>, A> 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(ClassPath.ClassInfo::load, x -> x.load().getAnnotation(annotation)), ImmutableMap::copyOf));
}
编辑:

当我没有指定map泛型但必须强制转换get方法时,它会编译。有没有办法避免这种情况

private final Map<Class<? extends Annotation>, ImmutableMap> cache;
私有最终映射,一个>>缓存;

没有强制转换似乎是不可能的,因此以下几行解决了我的问题:

private final Map<Class<? extends Annotation>, ImmutableMap> cache;

public <A extends Annotation> ImmutableMap<Class<?>, A> get(Class<A> annotation) {
    @SuppressWarnings("unchecked")
    ImmutableMap<Class<?>, A> cached = cache.get(annotation);
    ...
}
private final Map,A>get(类注释){
@抑制警告(“未选中”)

ImmutableMap无法将在一个成员上声明的泛型类型参数绑定到另一个成员。必须在类级别声明类型参数(使整个类成为泛型)。我可以,但正如所述,它是提供程序的单个实例。将泛型添加到我的类将迫使我为每个批注类型创建提供程序。然后我的想法就变得无用了。您尝试执行的操作无法完成。如果要在字段中使用泛型类型参数,则必须在类中声明它。请参阅“我必须强制转换get方法。有没有办法避免这种情况?”-没有。“如上所述,它是提供程序的一个实例。向类添加泛型将迫使我为每个注释类型创建一个提供程序。“-并且有一个
缓存
映射的实例,只有一个泛型类型。映射的声明如何知道在运行时查询的注释?
private final Map<Class<? extends Annotation>, ImmutableMap> cache;
private final <A extends Annotation> Map<Class<A>, ImmutableMap<Class<?>, A>> cache;
private final Map<Class<? extends Annotation>, ImmutableMap> cache;

public <A extends Annotation> ImmutableMap<Class<?>, A> get(Class<A> annotation) {
    @SuppressWarnings("unchecked")
    ImmutableMap<Class<?>, A> cached = cache.get(annotation);
    ...
}
public interface AnnotatedClassProvider {
    <A extends Annotation> ImmutableMap<Class<?>, A> get(Class<A> annotation) throws IOException;
}
public abstract class AbstractAnnotatedClassProvider implements AnnotatedClassProvider {
    private final Map<Class<? extends Annotation>, ImmutableMap> cache;

    public AbstractAnnotatedClassProvider() {
        this.cache = Maps.newHashMap();
    }

    protected final <A extends Annotation> ImmutableMap<Class<?>, A> find(Class<A> annotation, @Nullable String basePackage) throws IOException {
        @SuppressWarnings("unchecked")
        ImmutableMap<Class<?>, A> cached = cache.get(annotation);

        if (cached != null)
            return cached;

        ClassPath classPath = ClassPath.from(Thread.currentThread().getContextClassLoader());

        ImmutableSet<ClassPath.ClassInfo> set = basePackage == null
                ? classPath.getAllClasses()
                : classPath.getTopLevelClasses(basePackage);

        cached = set.stream()
                .filter(x -> x.load().getAnnotation(annotation) != null)
                .collect(Collectors.collectingAndThen(Collectors
                        .toMap(ClassPath.ClassInfo::load, x -> x.load().getAnnotation(annotation)), ImmutableMap::copyOf));
        this.cache.put(annotation, cached);
        return (cached);
    }
}
public final class Providers {
    public static AnnotatedClassProvider newBased(String basePackage) {
        return new AbstractAnnotatedClassProvider() {
            @Override
            public <A extends Annotation> ImmutableMap<Class<?>, A> get(Class<A> annotation) throws IOException {
                return super.find(annotation, basePackage);
            }
        };
    }

    public static AnnotatedClassProvider newSimple() {
        return new AbstractAnnotatedClassProvider() {
            @Override
            public <A extends Annotation> ImmutableMap<Class<?>, A> get(Class<A> annotation) throws IOException {
                return super.find(annotation, null);
            }
        };
    }
}
@Retention(RUNTIME)
@Target(ElementType.TYPE)
public @interface Controller {
    String value();
}

package com.test

@Controller("mainController")
public class Main {

    public static void main(String[] args) {
        AnnotatedClassProvider provider = Providers.newBased("com.test");
        Map<Class<?>, Controller> classes = provider.get(Controller.class);

        classes.forEach((x, y ) -> System.out.println(String.format("Class: %s annotated with %s with value %s",
                x.getName(), y.getClass().getName(), y.value())));
    }
}