Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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_Generics_Recursion_Nested Generics - Fatal编程技术网

Java 递归方法中的泛型

Java 递归方法中的泛型,java,generics,recursion,nested-generics,Java,Generics,Recursion,Nested Generics,几个小时以来,我一直在为这件事把头撞在桌子上 我有这张地图: private static Map您可以使用表示超类的类型变量: @SuppressWarnings("unchecked") public static <S extends BaseClass, C extends S> Predicate<C> getConstraints(Class<C> clazz) { if (clazz == BaseClass.class) {

几个小时以来,我一直在为这件事把头撞在桌子上

我有这张地图:

private static Map您可以使用表示超类的类型变量:

@SuppressWarnings("unchecked")
public static <S extends BaseClass, C extends S> Predicate<C> getConstraints(Class<C> clazz) {
    if (clazz == BaseClass.class) {
        return (Predicate<C>) constraints.getOrDefault(BaseClass.class, x -> true);
    }
    Class<S> superClass = (Class<S>) clazz.getSuperclass();
    Predicate<C> p1 = (Predicate<C>) constraints.getOrDefault(clazz, x -> true);
    Predicate<S> p2 = getConstraints(superClass);
    return p1.and(p2);
}
@SuppressWarnings(“未选中”)
公共静态谓词getConstraints(类clazz){
if(clazz==BaseClass.class){
return(Predicate)constraints.getOrDefault(BaseClass.class,x->true);
}
Class superClass=(Class)clazz.getSuperclass();
谓词p1=(谓词)约束;
谓词p2=getConstraints(超类);
返回p1和(p2);
}

您还必须强制转换
getOrDefault
的结果,因为将
谓词
放在映射中会“忘记”类型信息,您会得到一个泛型
谓词。谢谢,这项工作很棒。我发现参数
C
可以省略。参数
S
足够了。
@SuppressWarnings("unchecked")
public static <S extends BaseClass, C extends S> Predicate<C> getConstraints(Class<C> clazz) {
    if (clazz == BaseClass.class) {
        return (Predicate<C>) constraints.getOrDefault(BaseClass.class, x -> true);
    }
    Class<S> superClass = (Class<S>) clazz.getSuperclass();
    Predicate<C> p1 = (Predicate<C>) constraints.getOrDefault(clazz, x -> true);
    Predicate<S> p2 = getConstraints(superClass);
    return p1.and(p2);
}