В testCopy одно из предупреждений заключается в том, что вы создаете экземпляр «необработанного типа» Copyable, а не какой-то конкретный Copyable . Как только вы создаете экземпляр Copyable, его можно применять только к Ts (который включает подтипы T). Чтобы создать экземпляр с формальным типом, определения классов нужно будет немного изменить:
public static class A<T extends A> implements Copyable<T>
public static class B<T extends B> extends A<T>
Следующая проблема заключается в том, что копируемому может быть передан только тип времени компиляции B (основанный на определении копируемого). И testCopy () выше передает ему тип во время компиляции Copyable. Ниже приведены некоторые примеры того, что будет работать, с краткими описаниями:
public void testExamples()
{
// implementation of A that applies to A and subtypes
Copyable<A> aCopier = new A<A>();
// implementation of B that applies to B and subtypes
Copyable<B> bCopier = new B<B>();
// implementation of A that applies to B and subtypes
Copyable<B> bCopier2 = new A<B>();
}