Sather - самый старый из известных мне языков, который рассматривает типы и классы отдельно.Тем не менее, это не совсем строго, поскольку можно по-прежнему использовать класс в качестве типа переменной (я думаю), просто нельзя подтипировать его.
Это не сильно отличается от того, что позволяет делать C ++:Вы можете использовать чисто абстрактные классы для определения типов и иметь все конкретные классы, реализующие их с помощью открытого наследования, но делить на подклассы друг друга с помощью частного наследования.Затем вы используете абстрактные классы для переменных типов, используя конкретные классы только в выражениях конструктора.
Java позволяет вам делать более или менее то же самое, определяя типы с использованием интерфейсов и реализаций с использованием классов, но потому что нет закрытыхнаследование, нет способа скрыть отношения наследования классов.
Имеет ли это какой-либо смысл вообще?