Здравствуйте, Petrovich_Alex, Вы писали:
P_A>собстенно, почему есть ошибка в строке
P_A>P_A>clean(list, newFilter());
P_A>
Могу ошибаться, но видиться проблема в том, что Filter<T> выводится в Filter<Object> т.к. у newFilter нет параметров, далее Filter<Object> поднимается до extends A, т.е. до Filter<A>. Т.к. из-за отсутсвия в яве ковариантности по параметру дженерика Filter<A> и Filter<B> это разные несовместимые типы, и Iterable<A> и Iterable<B> тоже несовместимы типы, то следовательно удовлитворить сигнатуре (Iterable<B>, Filter<A>) компилятор не может.
Проверим догадку и дадим один фейковый параметр, из которого компилятор может попытаться вывести тип:
public class Sample2 {
public static void main(String[] args) {
List<B> list = new ArrayList<B>();
clean(list, newFilter(B.class));
}
private static <T extends A> Filter<T> newFilter(Class<T> clz) {
return new MyFilter<T>();
}
private static <T extends A> void clean(Iterable<T> iterable, Filter<T> filter) {
for (Iterator<T> iterator = iterable.iterator(); iterator.hasNext();) {
T t = iterator.next();
if (filter.accept(t))
System.out.println(t);
else
System.out.println("Rej: " + t);
}
}
}
Похоже что вывел
$ javac Sample2.java
$ java Sample2
Rej: B@3e25a5
Rej: B@19821f