Спасибо, "Том Хотин - tackline", я включил ваш ответ,
и это подходит. Кроме того, следующий код демонстрирует (немного странно)
необходимость изменения параметров типа списка (если вам нужен список атомов)
interface ISpace<S extends ISpace<S, A>, A extends IAtom<S, A>> {
List<IAtom<? extends S, ? extends A>> getList();
}
interface IAtom<S extends ISpace<S, A>, A extends IAtom<S, A>> {
S getSpace();
}
abstract class Space<S extends Space<S, A>, A extends Atom<S, A>>
implements ISpace<S, A> {
private final List<IAtom<? extends S, ? extends A>> atoms =
new LinkedList<IAtom<? extends S, ? extends A>>();
public Space() {
}
@Override
public List<IAtom<? extends S, ? extends A>> getList() {
return atoms;
}
}
abstract class Atom<S extends Space<S, A>, A extends Atom<S, A>>
implements IAtom<S, A> {
private final S space;
public Atom(S someSpace) {
this.space = someSpace;
/// THIS WILL NOT WORK WITHOUT THOSE STRANGE LIST TYPE PARAMETERS
space.getList().add(this);
}
@Override
public S getSpace() {
return space;
}
}
class Space1 extends Space<Space1, Atom1> {
public Space1() {
}
}
class Atom1 extends Atom<Space1, Atom1> {
public Atom1(Space1 someSpace) {
super(someSpace);
}
}
Идея, лежащая в основе всего этого:
Мне нужны элементы-элементы, которые знают свой тип контейнера безопасно
и контейнерные объекты, которые знают свои элементы тип-безопасно.