Создание объекта зависящего от других объектов в джава

Имеется следующая задача - нужно создать объект ёмкость в основаниях которого могут быть такие фигуры как квадрат, прямоугольник, круг и тому подобное. Емкость должна быть наклонной с одинаковыми углами наклона во всех направлениях. (Я описал не всю задачу а только тот момент который у меня вызвал вопрос). Я написал следующие классы:

public abstract class Container {
    private float volume;
    private Liquid liquid;
    private float height;
    private float weight;
}

public class InclinedContainer extends Container {
    private InclinedContainerBase largeBase;
    private InclinedContainerBase littleBase;

    public InclinedContainer(InclinedContainerBase largeBase,
                             InclinedContainerBase littleBase) {
        this.largeBase = largeBase;
        this.littleBase = littleBase;
    }
}

Я реализовал класс InclinedContainer, он состоит из двух оснований - большего и меньшего. Классы оснований написаны и имеют общий интерфейс InclinedContainerBase. И на этом этапе я столкнулся с проблемой, ведь в данном случае пользователь моих классов сможет создать ескость в которой будет верхнее основание квадрат а нижнее круг - а этого не должно быть. Мой вопрос заключается в том, как правильно реализовать что бы при создании объекта InclinedContainer в конструктор можно было передавать только объекты одного типа, если в качестве первого параметра консруктора был передан квадрат, то и в качестве второго так же должен быть передан квадрат.

введите сюда описание изображения


Ответы (2 шт):

Автор решения: DmitryD
public class Circle extends Container {
}

public class Square extends Container {
}

public class InclinedContainer extends Container {
    private Container largeBase;
    private Container littleBase;

    public InclinedContainer(Circle largeBase, Circle littleBase) {
        this.largeBase = largeBase;
        this.littleBase = littleBase;
    }

    public InclinedContainer(Square largeBase, Square littleBase) {
        this.largeBase = largeBase;
        this.littleBase = littleBase;
    }
}
→ Ссылка
Автор решения: Roman Konoval

Сделайте InclinedContainer параметризированным типом:

public class InclinedContainer<T extends InclinedContainerBase> extends Container {
    private T largeBase;
    private T littleBase;

    public InclinedContainer(T largeBase,
                             T littleBase) {
        this.largeBase = largeBase;
        this.littleBase = littleBase;
    }
}

Тогда типы с разными базами будут отличаться:

CircleBase littleBase = ...;
CircleBase largeBase = ...;
InclindedContainer<CirleBase> cirleBaseContainer = new InclindedContainer<CirleBase>(largeBase, littleBase);
→ Ссылка