В моем приложении у меня есть набор объектов разных типов: скажем, A, B, C, D. Некоторые из этих объектов могут иметь " link " с другим объектом, означающим, что Например, объект A может владеть набором объектов типа B.
Я лично решил эту проблему, создав интерфейс:
public interface Linkable<T extends Item>{
public link(List<T extends Item>);
}
, чтобы объект, который может иметь ссылку с другими нужно реализовать этот интерфейс: скажем, A, B и C реализуют Linkable
Более того, я хочу ограничить тип объектов, которые могут быть связаны с некоторыми объектами. Например, я хочу, чтобы объекты типа A могли быть связаны только с объектами типа B и наоборот (ссылка всегда работает в обоих направлениях).
Моя идея заключалась в том, чтобы создать иерархию интерфейсов для того, чтобы разрешить только указывать c тип ссылок: скажем:
ITEM
|
------------
| |
I1 I2
A implements I1, I2
B implements I1
C implements I2
Моя цель в качестве примера состоит в том, что экземпляры B могут быть связаны только с экземплярами A, в то время как экземпляры C не могут быть связаны с экземплярами Б.
Я лично вижу некоторые дыры в этом дизайне. На самом деле, я думаю, что есть необходимость в дополнительных ограничениях, которые я не рассматриваю. Когда я переопределю метод Linkable::link
в классах A, B, C, он должен будет принимать подтипы Item, поэтому в случае C я смогу добавить ссылку на экземпляры B просто потому, что I1
и I2
являются подтипами ITEM
.
Более того, я чувствую, что тип Item
должен быть ограничен теми, кто реализует интерфейс Linkable
.
Как я могу ограничить типы во время переопределения? Я что-то упустил?