Restrições Genéricas
Limite os parâmetros de tipo
Restrições Genéricas é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 4 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.
Restringindo parâmetros de tipo
Às vezes, um tipo genérico deve aceitar apenas determinados tipos, por exemplo, tipos que podem ser comparados ou que são subclasses de uma classe base. As restrições genéricas definem um limite superior para um parâmetro de tipo.
O limite superior padrão
Sem uma restrição, o limite superior de um parâmetro de tipo é Any?, portanto ele aceita qualquer tipo, inclusive tipos anuláveis. Para permitir apenas tipos não nulos, limite-o a Any.
fun <T : Any> requireNonNull(value: T): T {
return value
}
fun main() {
println(requireNonNull(42))
}Um único limite superior
Use T : Bound para exigir que T seja um subtipo de Bound. Isso permite chamar os membros do limite dentro da função.
fun <T : Number> sumDoubled(a: T, b: T): Double {
return a.toDouble() * 2 + b.toDouble() * 2
}
fun main() {
println(sumDoubled(3, 4))
println(sumDoubled(1.5, 2.5))
}Limite Comparable
Um limite comum é Comparable<T>, que permite comparar elementos com <, > ou compareTo.
fun <T : Comparable<T>> maxOf2(a: T, b: T): T {
return if (a > b) a else b
}
fun main() {
println(maxOf2(3, 9))
println(maxOf2("apple", "banana"))
}Chamando membros do limite
Dentro de um genérico restrito, o compilador sabe que T tem a API do limite, portanto você pode chamar esses métodos diretamente, sem conversão de tipo.
fun <T : CharSequence> describe(value: T): String {
return "Length is ${value.length}"
}
fun main() {
println(describe("hello"))
println(describe(StringBuilder("hi")))
}Vários limites com where
Para mais de um limite, use a cláusula where. T deve então satisfazer ALL as restrições listadas.
fun <T> copyWhenValid(value: T): T
where T : CharSequence, T : Comparable<T> {
return value
}
fun main() {
println(copyWhenValid("text"))
}Limites em classes
As restrições também funcionam em classes genéricas, limitando os tipos com os quais a classe pode ser instanciada.
class NumberBox<T : Number>(val value: T) {
fun asDouble(): Double = value.toDouble()
}
fun main() {
val box = NumberBox(10)
println(box.asDouble())
}A restrição habilita operações
O objetivo de uma restrição é justamente habilitar operações. Sem T : Number, você não poderia chamar toDouble(); o limite garante que o método exista.
Limite não nulo na prática
Limitar a Any rejeita argumentos anuláveis em tempo de compilação, uma maneira prática de exigir genéricos não nulos.
fun <T : Any> firstNonNull(a: T, b: T): T = a
fun main() {
println(firstNonNull("x", "y"))
// firstNonNull(null, "y") would not compile
}Combinando com variância
Restrições e variância resolvem problemas diferentes: a variância (in/out) controla relações de subtipagem, enquanto as restrições (limites :, where) limitam quais tipos são permitidos. Elas podem ser usadas em conjunto.
Projetando boas restrições
Adicione uma restrição apenas quando precisar de uma capacidade do tipo. Restringir demais reduz a reutilização; restringir de menos força conversões de tipo. Use como limite o tipo mais geral que forneça as operações utilizadas.
Verificação rápida
Como você exige que um parâmetro de tipo satisfaça mais de um limite?
Recapitulação
As restrições genéricas definem limites superiores com T : Bound (ou where para vários limites), habilitando as operações do limite e excluindo tipos incompatíveis. Limitar a Any exige valores não nulos. Combinadas com a variância, as restrições permitem projetar genéricos seguros e expressivos. Isso conclui o curso de Genéricos e Variância.
Perguntas Frequentes
A aula “Restrições Genéricas” é grátis?
Sim — o texto completo de “Restrições 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 “Restrições Genéricas”?
Limite os parâmetros de tipo 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 4 de 4.
Quanto tempo leva a aula “Restrições 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
- Funções e Classes Genéricas
- Variância no Local da Declaração
- Variância no Local de Uso
- Restrições Genéricas