Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Непонятки с generic'ами


Автор: w1nd 21.12.2006, 12:00
Пример - 
Код
public class Test {
    public static class A {}
    public static class B extends A {}
    public static class C<T extends A> {
        public void test(T t) {
        }
    }
    public static class D extends C<B> {}
    public static class E {
        public C<? extends A> createC() {
            return new D();
        }
    }
    public void test() {
        A a = new A();
        B b = new B();
        E e = new E();  
        
        C<? extends A> c = e.createC();
        
        c.test(a);
        c.test(b);
    }
}

 - не компилируется. Кто-нить может пояснить, почему, и как это можно объехать?

Автор: powerOn 21.12.2006, 12:18
Попробуй так:
Код

C c = e.createC();



Автор: w1nd 21.12.2006, 12:30
Цитата(powerOn @ 21.12.2006,  12:18)
Попробуй так:

Код

C c = e.createC();

Ну, против этого лома, конечно, приёма нет smile Но хотелось бы понять, где зарыли собачий трупик... 

Автор: NotGonnaGetUs 21.12.2006, 17:20
Код

 public static class C<T extends A> {
        T tt;
        public void test(T t) {
                 tt = t;
        }
    }
...
C<? extends A> c = e.createC(); // new D extends C<B>;
c.test(a);

Как ты предлагаешь tt присвоить значение типа A 
и не получить рантайм ошибки при будущих обращениях к tt как к экземпляру класса B в классе D?

Автор: w1nd 22.12.2006, 14:09
Цитата(NotGonnaGetUs @  21.12.2006,  17:20 Найти цитируемый пост)
Как ты предлагаешь tt присвоить значение типа A и не получить рантайм ошибки при будущих обращениях к tt как к экземпляру класса B в классе D?

Я просто не собираюсь этого делать smile Пример являет собой обезличенный кусок реального кода, я хочу избавиться от приведения параметра. Единственный смысл выноса параметризации на уровень класса в том, что такой же тип должен использоваться и в других методах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)