泛型和Java警告

泛型和Java警告,java,generics,Java,Generics,我知道这个话题已经安静地讨论了一段时间(例如,、等等),但我面临着一种无法解释的情况 我有一个谓词类定义为 public interface Predicate<T> { boolean holds(T o) ; } 公共接口谓词{ 布尔保持(to); } 然后,我有一个实用类(PredicateUtils)来组成谓词。其中的一个示例方法是 public static <T> Predicate join(final Predicate<T> p

我知道这个话题已经安静地讨论了一段时间(例如,、等等),但我面临着一种无法解释的情况

我有一个谓词类定义为

public interface Predicate<T> {
    boolean holds(T o) ; 
}
公共接口谓词{
布尔保持(to);
}
然后,我有一个实用类(PredicateUtils)来组成谓词。其中的一个示例方法是

public static <T> Predicate join(final Predicate<T> p1, final Predicate<T> p2) {
    return new Predicate<T>() {

        @Override
        public boolean holds(T o) {
            return (p1.holds(o) && p2.holds(o)) ;
        }
    } ;
}
公共静态谓词联接(最终谓词p1,最终谓词p2){
返回新谓词(){
@凌驾
公共布尔保持(TO){
回报(p1.持有(o)和p2.持有(o));
}
} ;
}
然而,当我调用一个连接方法时,例如,传递两个谓词实例,我从jdk(JavaC1.7.051)编译器中得到以下错误:

warning: [unchecked] unchecked conversion
        return PredicateUtils.join(p1, p2) 
  required: Predicate<Integer>
  found:    Predicate
警告:[未选中]未选中的转换
返回谓词EUTILS.join(p1,p2)
必需:谓词
发现:谓词
为了简化讨论,once可以在给定类中定义以下方法(伪代码):

public static Predicate<Integer> test() {
    Predicate<Integer> p1 = new Predicate<Integer>() {
        public boolean holds(Integer o) { return true ; }
    };
    Predicate<Integer> p2 = new Predicate<Integer>() {
        public boolean holds(Integer o) { return true ; }
    };
    return join(p1, p2) ;
}
公共静态谓词测试(){
谓词p1=新谓词(){
公共布尔保持(整数o){return true;}
};
谓词p2=新谓词(){
公共布尔保持(整数o){return true;}
};
返回连接(p1,p2);
}

编译相关类时,javac会发出相同的警告。

正如编译器试图告诉您的,您的方法返回的是
谓词
,而不是
谓词

不要那样做


如果创建泛型类,则应始终将其与泛型参数一起使用。

请注意
join
方法的返回类型:

public static <T> Predicate join(final Predicate<T> p1, final Predicate<T> p2)
公共静态谓词联接(最终谓词p1,最终谓词p2)
您使用的是原始类型,因此发出了警告。将其更改为:

public static <T> Predicate<T> join(final Predicate<T> p1, final Predicate<T> p2)
公共静态谓词联接(最终谓词p1,最终谓词p2)

的确如此。我错过了:)谢谢。当然,这不是我的本意,而是一个失误。谢谢