Predicate接口默认方法and为何无需声明泛型<T>?
关于Predicate接口and默认方法泛型的疑问解答
先把你给出的Predicate<T>接口代码格式化后展示:
@FunctionalInterface public interface Predicate<T> { boolean test(T t); default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t); } static <T> Predicate<T> isEqual(Object targetRef) { return (null == targetRef) ? Objects::isNull : object -> targetRef.equals(object); } }
好问题!你之所以会疑惑要不要在and方法前加<T>,核心是混淆了接口级泛型参数和方法级泛型参数的使用场景:
- 首先,
Predicate<T>接口在声明时就已经定义了泛型参数<T>,而and作为接口的默认实例方法,属于接口的成员范畴,它可以直接复用接口本身的泛型参数T——就像普通类的成员方法能直接使用类声明的泛型参数一样,完全不需要额外声明。 - 如果给
and方法加上<T>,相当于给这个方法单独定义了一个方法级的泛型参数,这会覆盖接口本身的泛型参数T,反而会造成类型逻辑的混乱,完全不符合设计意图。
再对比看接口里的静态方法isEqual:它之所以需要声明<T>,是因为静态方法不属于任何接口实例,无法直接访问接口的泛型参数,必须自己定义方法级泛型来指定返回的Predicate的类型。这也能帮你更清晰地理解两种泛型参数的区别。
内容的提问来源于stack exchange,提问作者kokon
相关产品推荐
相关产品推荐

