为了账号安全,请及时绑定邮箱和手机立即绑定

递归方法中的泛型

递归方法中的泛型

拉风的咖菲猫 2021-10-06 12:39:47
几个小时以来,我一直在用头撞桌子。我有这张地图:private static Map<Class<? extends BaseClass>, Predicate<? extends BaseClass>> constraints;我有这个方法:public static <C extends BaseClass> Predicate<C> getConstraints(Class<? super C> clazz) {    if (clazz == BaseClass.class) {        return (Predicate<C>) constraints.getOrDefault(BaseClass.class, x -> true);    }    Class<? super C> superClass = clazz.getSuperclass();    return constraints.getOrDefault(clazz, x -> true).and(getConstraints(superClass));}所有这些都应该做的是在Predicate<T>usingand()方法中链接某个类(和超类)的所有约束。泛型对我来说似乎合乎逻辑,但在进行递归调用时仍然出错。getConstraints(Class<? super C>) cannot be applied to Class<capture of ? super E>. 我不明白,因为superClass它的类型Class<? super C>正是我的方法接受的参数。有任何想法吗?
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

您可以使用代表超类的类型变量:


@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);

}

您还必须转换 的结果getOrDefault,因为将 放入Predicate地图“忘记”了类型信息,并且您会返回一个Predicate<? extends BaseClass>不能直接使用的泛型。


查看完整回答
反对 回复 2021-10-06
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信