В википедии дано вот такое определение.
В 1974 году Лисков и Зиллес (англ. Liskov and Zilles) назвали сильно типизированными те языки, в которых «при передаче объекта из вызывающей функции в вызываемую, тип этого объекта должен быть совместим с типом, определённым в вызываемой функции»[1]. Джексон писал: «В сильно типизированном языке всякая ячейка данных будет иметь уникальный тип и всякий процесс будет провозглашать свои требования по взаимосвязи в терминах этих типов»[2].
В статье Луки Карделли[en] «Полнотиповое программирование»[3], система типов называется «сильной», если она исключает возможность возникновения ошибки согласования типов времени выполнения. Иначе говоря, отсутствие непроконтролированных ошибок времени выполнения называется типобезопасностью; ранние работы Хоара называют это свойство безопасностью (англ. security).
Непонятно, какой в этом толк. Допустим, есть тип лист, который имеет свойство intersect. допустим, есть объект этого типа, в котором этот intersect переопределен.
l1 := list(1,2,3)
l2 := list(2,3,4)
f := method(list1, list2, list1 intersect(list2))
f(l1, l2) // list(2, 3)
l1 intersect := "foo"
f(l1, l2) // foo
Тип по-прежнему тот же, а результат другой.
Это значит, что нам для типобезопасности, нужна еще и иммутабельность? Тогда непонятно, причем тут ООП, ведь Лисков — она вроде про ООП писала?