【问题标题】:Generics and Java warning泛型和 Java 警告
【发布时间】:2014-03-07 21:17:04
【问题描述】:

我知道这个话题已经讨论了一段时间了(例如,Java generics warnings on java.util.Collectionsjava generics, unchecked warnings 等),但我正面临着我无法找到解释的情况。

我有一个 Predicate 类定义为

public interface Predicate<T> {
    boolean holds(T o) ; 
}

然后,我有一个实用程序类 (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)) ;
        }
    } ;
}

但是,当我调用 join 方法时,例如,传递两个 Predicate 实例,我从 jdk (javac 1.7.0_51) 编译器收到以下错误:

warning: [unchecked] unchecked conversion
        return PredicateUtils.join(p1, p2) 
  required: Predicate<Integer>
  found:    Predicate

为了简化讨论,可以在给定的类中定义下面的方法(虚拟代码):

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) ;
}

并且会看到在编译相关类时,javac 会发出相同的警告。

【问题讨论】:

    标签: java generics


    【解决方案1】:

    注意join 方法的返回类型:

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

    您使用的是原始类型,因此会发出警告。将其更改为:

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

    【讨论】:

    • 确实如此。我错过了 :) 谢谢。
    【解决方案2】:

    正如编译器试图告诉你的那样,你的方法返回Predicate,而不是Predicate&lt;T&gt;

    不要那样做。

    如果你创建一个泛型类,你应该总是将它与泛型参数一起使用。

    【讨论】:

    • 当然,这不是本意,而是一个失误。谢谢。
    猜你喜欢
    • 2021-03-27
    • 2013-03-08
    • 2013-05-01
    • 1970-01-01
    • 2013-12-30
    • 2010-10-20
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多