Esse design realmente remonta ao Smalltalk, que eu consideraria em grande parte como uma tentativa de buscar a orientação a objetos à custa de quase toda e qualquer outra preocupação. Como tal, tende (na minha opinião) a usar a orientação a objetos, mesmo quando outras técnicas são provavelmente (ou até certamente) superiores.
Ter uma única hierarquia com Object(ou algo semelhante) na raiz facilita bastante (por exemplo) criar suas classes de coleção como coleções de Object, portanto, é trivial que uma coleção contenha qualquer tipo de objeto.
Em troca dessa pequena vantagem, você obtém uma série de desvantagens. Primeiro, do ponto de vista do design, você acaba tendo algumas idéias realmente insanas. Pelo menos de acordo com a visão Java do universo, o que o ateísmo e a floresta têm em comum? Que ambos têm códigos de hash! Um mapa é uma coleção? De acordo com Java, não, não é!
Nos anos 70, quando o Smalltalk estava sendo projetado, esse tipo de absurdo foi aceito, principalmente porque ninguém havia projetado uma alternativa razoável. O Smalltalk foi finalizado em 1980 e, em 1983, Ada (que inclui genéricos) foi projetado. Embora Ada nunca tenha alcançado o tipo de popularidade que alguns previram, seus genéricos foram suficientes para suportar coleções de objetos de tipos arbitrários - sem a loucura inerente às hierarquias monolíticas.
Quando o Java (e, em menor grau, o .NET) foram projetados, a hierarquia monolítica de classes provavelmente foi vista como uma opção "segura" - com problemas, mas principalmente problemas conhecidos . A programação genérica, por outro lado, foi uma que quase todo mundo (até então) percebeu que era pelo menos teoricamente uma abordagem muito melhor para o problema, mas que muitos desenvolvedores com orientação comercial consideravam pouco explorada e / ou arriscada (isto é, no mundo comercial). Ada foi amplamente descartado como um fracasso).
Deixe-me ser claro: a hierarquia monolítica foi um erro. As razões para esse erro eram pelo menos compreensíveis, mas era um erro de qualquer maneira. É um design ruim e seus problemas de design permeiam quase todo o código que o utiliza.
Para um novo design hoje, no entanto, não há uma pergunta razoável: usar uma hierarquia monolítica é um erro claro e uma má idéia.
objectna estrutura do .NET em parte porque ela fornece alguns recursos básicos em todos os objetos, comoToString()eGetHashCode()