我知道这个主题现在已经讨论了一段时间(例如,java.util.Collections上的Java泛型警告,java泛型,未经检查的警告等)但我面临的情况是我无法找到解释.
我有一个谓词类定义为
public interface Predicate<T> {
boolean holds(T o) ;
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一个实用程序类(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)) ;
}
} ;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我调用join方法时,例如,传递两个Predicate实例,我从jdk(javac 1.7.0_51)编译器得到以下错误:
warning: [unchecked] unchecked conversion
return PredicateUtils.join(p1, p2)
required: Predicate<Integer>
found: Predicate
Run Code Online (Sandbox Code Playgroud)
为了简化讨论,可以在给定的类中定义方法(虚拟代码):
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) ;
}
Run Code Online (Sandbox Code Playgroud)
并且会看到在编译相关类时,javac会发出相同的警告.
注意方法的返回类型join:
public static <T> Predicate join(final Predicate<T> p1, final Predicate<T> p2)
Run Code Online (Sandbox Code Playgroud)
你正在使用原始类型,因此警告.将其更改为:
public static <T> Predicate<T> join(final Predicate<T> p1, final Predicate<T> p2)
Run Code Online (Sandbox Code Playgroud)