Kotlin Academy · Aula

Funções e Classes Genéricas

Parametrize os tipos

Aula 1 de 413 etapas

Funções e Classes Genéricas é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

O que são genéricos?

Genéricos permitem escrever código que funciona com vários tipos, mantendo a segurança total de tipos. Em vez de fixar um tipo concreto, você usa um parâmetro de tipo, geralmente T, como marcador.

Uma função genérica

Uma função genérica declara seu parâmetro de tipo entre sinais de menor e maior antes do nome da função. Aqui, T pode ser qualquer tipo.

fun <T> identity(value: T): T {
    return value
}

fun main() {
    println(identity(42))
    println(identity("hello"))
}

Inferência de tipos

Você raramente precisa especificar o tipo explicitamente; o compilador infere T a partir dos argumentos. Ainda assim, você pode escrevê-lo como identity<Int>(42) quando necessário.

fun <T> firstOf(a: T, b: T): T = a

fun main() {
    val x = firstOf(10, 20)
    val y = firstOf("a", "b")
    println("$x $y")
}

Vários parâmetros de tipo

Uma função pode ter vários parâmetros de tipo, o que é útil para trabalhar com pares de tipos não relacionados.

fun <A, B> makePair(first: A, second: B): Pair<A, B> {
    return Pair(first, second)
}

fun main() {
    val p = makePair("age", 30)
    println(p)
}

Uma classe genérica

As classes também podem ser genéricas. O parâmetro de tipo é declarado depois do nome da classe e pode ser usado em propriedades e funções.

class Box<T>(val value: T) {
    fun get(): T = value
}

fun main() {
    val intBox = Box(123)
    val strBox = Box("Kotlin")
    println(intBox.get())
    println(strBox.get())
}

Classe genérica com comportamento

Classes genéricas podem manter estado mutável e operar sobre o parâmetro de tipo, como um contêiner simples.

class Stack<T> {
    private val items = mutableListOf<T>()
    fun push(item: T) { items.add(item) }
    fun pop(): T = items.removeAt(items.size - 1)
    fun isEmpty() = items.isEmpty()
}

fun main() {
    val stack = Stack<Int>()
    stack.push(1)
    stack.push(2)
    println(stack.pop())
}

Interfaces genéricas

As interfaces também podem declarar parâmetros de tipo, permitindo que as implementações escolham o tipo concreto.

interface Container<T> {
    fun item(): T
}

class StringContainer : Container<String> {
    override fun item(): String = "fixed"
}

fun main() {
    println(StringContainer().item())
}

Por que não usar apenas Any?

Você poderia armazenar valores como Any, mas perderia as informações de tipo e precisaria fazer conversões de tipo. Os genéricos preservam o tipo exato, permitindo que o compilador detecte erros sem a necessidade de conversões.

fun main() {
    val box: Box<String> = Box("text")
    val s: String = box.get()
    println(s.uppercase())
}

class Box<T>(val value: T) { fun get(): T = value }

Funções de extensão genéricas

As funções de extensão podem ser genéricas, permitindo criar utilitários reutilizáveis para todos os tipos.

fun <T> T.printAndReturn(): T {
    println("Value: $this")
    return this
}

fun main() {
    val x = 5.printAndReturn()
    "hi".printAndReturn()
    println(x)
}

Convenções de nomenclatura

Por convenção, letras maiúsculas únicas nomeiam parâmetros de tipo: T para um tipo genérico, E para um elemento, K e V para chaves e valores de mapas, e R para um resultado.

Genéricos em toda parte

A biblioteca padrão do Kotlin é construída sobre genéricos: List<T>, Map<K, V>, Pair<A, B>. Entender genéricos ajuda você a ler e usar esses tipos com confiança.

Verificação rápida

Qual é o principal benefício dos genéricos em comparação com o uso de Any?

Recapitulação

Os genéricos usam parâmetros de tipo como T para escrever funções, classes e interfaces reutilizáveis e com segurança de tipos. O compilador infere os tipos e impõe essa segurança, evitando conversões de tipo. Em seguida, você controlará como os tipos genéricos se relacionam usando variância no local da declaração com in e out.

Grátis para começar

Aprenda Kotlin com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Funções e Classes Genéricas” é grátis?

Sim — o texto completo de “Funções e Classes Genéricas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “Funções e Classes Genéricas”?

Parametrize os tipos Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Funções e Classes Genéricas”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Funções e Classes Genéricas
  2. Variância no Local da Declaração
  3. Variância no Local de Uso
  4. Restrições Genéricas
← Voltar para Kotlin Academy