Pular para o conteúdo principal

Generics e Templates

Generics permitem que você escreva código reutilizável e com segurança de tipos. Veja como diferentes linguagens lidam com programação genérica.

Generics Básicos​

// JavaScript has no built-in generics
// Use TypeScript for generic support

// TypeScript generics:
// function identity<T>(value: T): T {
// return value;
// }
// identity<string>("hello");
// identity<number>(42);

// Generic interface (TypeScript)
// interface Container<T> {
// value: T;
// getValue(): T;
// }

// Generic class (TypeScript)
// class Box<T> {
// constructor(private value: T) {}
// get(): T { return this.value; }
// }
// const box = new Box<string>("hello");

Restrições de Tipo​

// TypeScript constraints
// function max<T extends number>(a: T, b: T): T {
// return a > b ? a : b;
// }

// Interface constraint
// interface HasLength { length: number; }
// function logLength<T extends HasLength>(item: T): void {
// console.log(item.length);
// }
// logLength("hello"); // OK
// logLength([1, 2, 3]); // OK
// logLength(42); // Error

// keyof constraint
// function getProperty<T, K extends keyof T>(
// obj: T, key: K
// ): T[K] {
// return obj[key];
// }

Principais Conclusões​

  • Type erasure vs monomorfização -- Java e TypeScript apagam generics em tempo de execução (uma representação compartilhada); C++, Rust, Swift e Go geram código especializado por tipo (monomorfização) para abstração de custo zero.
  • Sistemas de restrição variam em expressividade -- As traits do Rust e os concepts do C++ oferecem bounds ricos; os conjuntos de tipo do Go (~int | ~float64) e as restrições de protocolo do Swift são mais simples; o extends e wildcards do Java são mais limitados.
  • Linguagens sem generics usam alternativas -- C usa void* e macros; JavaScript/Ruby dependem de duck typing; PHP usa anotações de docblock para análise estática; Zig usa parâmetros de tipo comptime.
  • Generics comptime (Zig) são únicos -- Zig passa tipos como valores em tempo de compilação, habilitando generics de custo zero sem uma sintaxe separada de parâmetros de tipo; tipos são de primeira classe em tempo de compilação.
  • Python e PHP têm generics tardios -- Python 3.12+ e PHPStan/Psalm adicionam sintaxe de generics; a verificação de tipos é apenas estática — o comportamento em tempo de execução permanece inalterado — diferente de linguagens compiladas.