Re: Генерики, наследование
От: aka50 Россия  
Дата: 15.05.07 19:57
Оценка: 1 (1)
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.