泛型和Java警告

lec*_*eco 4 java generics

我知道这个主题现在已经讨论了一段时间(例如,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会发出相同的警告.

Roh*_*ain 8

注意方法的返回类型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)


SLa*_*aks 6

正如编译器试图告诉你的那样,你的方法Predicate不会返回Predicate<T>.

不要那样做.

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