递归方法中的泛型
Generics in recursive method
几个小时以来,我一直在为 table 苦苦思索。
我有这张地图:
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));
}
所有这一切应该做的是使用 and()
方法在 Predicate<T>
中链接特定 class(和超级 classes)的所有约束.
泛型对我来说似乎合乎逻辑,但在进行递归调用时我仍然遇到错误。 getConstraints(Class<? super C>) cannot be applied to Class<capture of ? super E>
。我不明白,因为 superClass
属于 Class<? super C>
类型,这正是我的方法接受的参数。有什么想法吗?
您可以使用表示超类的类型变量:
@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
放入地图 'forgets' 类型信息中,您会得到一个通用的 Predicate<? extends BaseClass>
,不能直接使用。
几个小时以来,我一直在为 table 苦苦思索。
我有这张地图:
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));
}
所有这一切应该做的是使用 and()
方法在 Predicate<T>
中链接特定 class(和超级 classes)的所有约束.
泛型对我来说似乎合乎逻辑,但在进行递归调用时我仍然遇到错误。 getConstraints(Class<? super C>) cannot be applied to Class<capture of ? super E>
。我不明白,因为 superClass
属于 Class<? super C>
类型,这正是我的方法接受的参数。有什么想法吗?
您可以使用表示超类的类型变量:
@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
放入地图 'forgets' 类型信息中,您会得到一个通用的 Predicate<? extends BaseClass>
,不能直接使用。