В любом языке существует наиболее общий тип — т.е. то, что может обозначать все на свете. В нашем языке русском это слово — фиговина.
Фиговиной можно назвать все что угодно.
Вот, в Java придумали уникальную идею — все является объектом. Т.е. наследником класса
Object. Кроме аксиоматических типов (int, float и пр.), они особняком, но для каждого из них есть объектное соответствие. Т.е. для любого объекта класса можно использовать универсальную ссылку — Object.
В C++, к примеру, неким аналогом является использование указателя void* (но там нет проверки приведения). Или пошли по другому пути — компил-таймовый C++ и шаблоны с T. С шаблонами как бы нет четкой проверки иерархии, но есть просто проверка использования. Не супер идея. Java придумали намного умнее.
Далее. C# чуть искаверкал идею Java, там уже нет аксиоматических типов — int уже как объект как и Int32 — целиком и полностью аналогичны, кроме буквы — аксиоматические как бы с маленькой буквы (причем и object типа аксиоматический). Т.е. пропала чистота идеи, но ОК, можно и так.
А потом в C# добавили как бы второй возможный механизм фиговины — dynamic. Но он скорее не используется или используется просто для синтаксиса — чтобы вместо keys["key1"] писать keys.key1 — ни то ни другое контролировать не нужно, но просто меньше писанины — по прежнему dynamic не особо важен для парадигм.
В Dart стало хуже — этот dynamic стал частью парадигм. К примеру даже есть
abstract interface class Comparable<T>
Я хочу в своем классе сделать поле, которое соответствует этому интерфейсу Comparable. Но без указания T — мне нужно чтобы был любой тип, который умеет сравнивать себя с собой.
Вот так:
abstract interface class ComparableWithSelf implements Comparable<ComparableWithSelf>{
}
— не сработает, т.к нет поддержки ковариантности ентой (или как там ее). Можно написать так:
abstract interface class MyComparable implements Comparable{
}
— тогда Т будет установлен в dynamic, а там можно все
Как бы пропала чистота идеи — по умолчанию возникает dynamic. В C# есть версия IComparable с object — а в Dart решили вместо object — сделать dynamic. Как бы вообще опустились почти до уровня JS.