次のコードを検討してください。
ICondition searchCondition, scopeCondition...
List<ICondition> filtered = CollectionUtil.filter(
Arrays.asList(searchCondition, scopeCondition),
CollectionUtil.isNonNull);
コンパイルに失敗します:
"
filter(Collection<T>, CollectionUtil.Predicate<T>)
型のメソッドCollectionUtil
は引数に適用できません(List<ICondition>, CollectionUtil.Predicate<Object>)
"
ICondition
-固有の述語を定義すればすべて問題isNonNull()
ありませんが、それはばかげており、何が問題なのか、それを修正する方法がわかりません。
ここに私のユーティリティ関数があります:
public interface Predicate<T>
{
boolean apply(T type);
}
public static <T> List<T> filter(Collection<T> target, Predicate<T> predicate)
{
target = Collections.unmodifiableCollection(target);
List<T> result = new ArrayList<T>();
for (T element: target) {
if (predicate.apply(element)) {
result.add(element);
}
}
return result;
}
// This predicate works as expected.
public static CollectionUtil.Predicate<String> isStringNonBlank = new CollectionUtil.Predicate<String>() {
public boolean apply (String item) {
return !StringUtils.isBlank(item);
}
};
// This predicate looks fine, but fails in usage.
public static CollectionUtil.Predicate<Object> isNonNull = new CollectionUtil.Predicate<Object>() {
public boolean apply (Object item) {
return null != item;
}
};
で 2 番目の述語を使用できないのはなぜfilter()
ですか?