如何创建ArrayPredicate <a extends="" object[]="">?

时间:2015-09-20 04:02:20

标签: java arrays generics interface predicate

I'm not trying to create an array of a generic type(例如E[])。我要做的是创建一个分析(非原始)数组的predicate,例如

public class ArrayPredicate<A extends Object[]> implements Predicate<A> {    

   public boolean test(A a) {
      if(a == null) return false;
      if(a.length == 0) return false;
      for(Object o: a) {
         if(o == null) return false;
      } 
      return true;
   }    

   ...
}

Predicate<Object[]>显然是编译错误。

更新:我需要将其扩展到StringArrayPredicateIntegerArrayPredicate,依此类推,以便验证每个元素的具体值。因此,班级本身必须是一体化的。

如何为数组创建一个通用谓词?

1 个答案:

答案 0 :(得分:2)

如果您想要Predicate<Object[]>,则无需将实现类本身设为通用。

编译:

public class ArrayPredicate implements Predicate<Object[]> {    

    public boolean test(Object[] a) {
       if(a == null) return false;
       if(a.length == 0) return false;
       for(Object o: a) {
          if(o == null) return false;
       } 
       return true;
    }    
 }

如果你想要对你的班级进行参数化:

public class ArrayPredicate<T> implements Predicate<T[]> {
    public boolean test(T[] a) {
        return a != null && a.length > 0 && !Arrays.stream(a).filter(o -> o == null).findAny().isPresent();
    }
}

如果您愿意,请注意方法体的java-8重构。