【发布时间】:2019-04-03 14:01:01
【问题描述】:
我拥有三个 Foo Boo Goo 对象,它们具有 Foo 超类的 Boo 和 Goo 子类型。
我正在使用谓词来过滤列表,如下所示
public class Predicates {
public static Predicate<Foo> isBoo() {
foo -> {
Boo boo = (Boo) foo;
return boo.isBoo();
};
}
public static Predicate<Goo> isGoo() {
foo -> {
Goo goo = (Goo) foo;
return goo.isGoo();
};
}
}
接下来我想要实现的是有一个泛型类型而不是指定的编译时类型。
public class Predicates {
public static <T extends Foo> Predicate<T> isBoo() {
foo -> {
// check both with instanceof
};
}
public static <T extends Foo> Predicate<T> isGoo() {
foo -> {
Goo goo = (Goo) foo;
return boo.isGoo();
};
}
public static <T extends Foo> Predicate<T> isFoo() {
isGoo().or(isBoo());
}
}
当使用 OR 或 AND 组合多个谓词时,似乎不可能将泛型与谓词一起使用。知道谓词可能有不同的类型,但仍然扩展了超类。
需要光!
【问题讨论】:
-
为什么不简单地
public static Predicate<? super Foo> isBoo() {? -
我不知道为什么,但在编译时。我不能在同一个列表中有两种不同的类型,即使它们继承自同一个超类!
-
我不确定您为什么要尝试使用通配符来完成谓词可能接受的值类型。该类型参数是关于谓词可以处理哪种对象的语句,而不是谓词将为哪种对象返回 true 的语句。我认为你在这里混淆了这两件事。鉴于上面的示例,您可以在任何地方使用
Predicate<Object>,因为“instanceof”适用于任何对象。 -
例如,如果 (Boo) 强制转换有效,isBoo() 会返回 false 吗?咕也一样。我认为您应该尝试使代码示例变得不那么琐碎,并且更现实地表明您的意图可能有一些实际用途。
-
也许您应该添加一些代码,该谓词将用于实现一些实际操作。
标签: java generics java-8 predicate