Em Scala, parâmetros de tipos e tipos abstratos podem ser restringidos por um limitante de tipo. Tal limitante de tipo limita os valores concretos de uma variável de tipo e possivelmente revela mais informações sobre os membros de determinados tipos. Um limitante superiror de tipos T <: A
declare que a variável tipo T
refere-se a um subtipo do tipo A
.
Aqui um exemplo que demonstra um limitante superior de tipo para um parâmetro de tipo da classe Cage
:
abstract class Animal {
def name: String
}
abstract class Pet extends Animal {}
class Gato extends Pet {
override def name: String = "Gato"
}
class Cachorro extends Pet {
override def name: String = "Cachorro"
}
class Leao extends Animal {
override def name: String = "Leao"
}
class Jaula[P <: Pet](p: P) {
def pet: P = p
}
object Main extends App {
var jaulaCachorro = new Jaula[Cachorro](new Cachorro)
var jaulaGato = new Jaula[Gato](new Gato)
/* Não é possível colocar Leao em Jaula pois Leao não estende Pet. */
// var jaulaLeao = new Jaula[Leao](new Leao)
}
Um instância da classe Jaula
pode conter um animal, porém com um limite superior do tipo Pet
. Um animal to tipo Leao
não é um pet, pois não estende Pet
, então não pode ser colocado em uma Jaula.
O uso de limitantes inferiores de tipo é discutido aqui.
Contributors to this page:
Contents
- Introdução
- Basics
- Tipos Unificados
- Classes
- Parâmetro com Valor Padrão
- Parâmetros Nomeados
- Traits
- Tuplas
- Composição de Classes Mixin
- Funções de ordem superior
- Funções Aninhadas
- Currying
- Classes Case
- Correspondência de Padrões
- Objetos Singleton
- Padrões de Expressões Regulares
- Objetos Extratores
- For Comprehensions
- Classes Genéricas
- Variâncias
- Limitante Superior de Tipos
- Limitante Inferior de Tipos
- Classes Internas
- Tipos Abstratos
- Tipos Compostos
- Auto Referências Explicitamente Tipadas
- Parâmetros Implícitos
- Conversões Implícitas
- Métodos Polimórficos
- Inferência de Tipo Local
- Operadores
- By-name Parameters
- Anotações
- Packages and Imports
- Package Objects