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