|
| 1 | +--- |
| 2 | +layout: tutorial |
| 3 | +title: Conversões Implícitas |
| 4 | + |
| 5 | +disqus: true |
| 6 | + |
| 7 | +tutorial: scala-tour |
| 8 | +num: 26 |
| 9 | +tutorial-next: polymorphic-methods |
| 10 | +tutorial-previous: implicit-parameters |
| 11 | +language: pt-br |
| 12 | +--- |
| 13 | + |
| 14 | +Uma conversão implícita do tipo `S` para o tipo `T` é definida por um valor implícito que tem o tipo de função `S => T`, ou por um método implícito convertível em um valor de tal tipo. |
| 15 | + |
| 16 | +As conversões implícitas são aplicadas em duas situações: |
| 17 | + |
| 18 | +* Se uma expressão `e` for do tipo`S` e `S` não estiver em conformidade com o tipo esperado `T` da expressão. |
| 19 | +* Em uma seleção `e.m` com `e` do tipo `T`, se o seletor `m` não representar um membro de `T`. |
| 20 | + |
| 21 | +No primeiro caso, é procurada uma conversão `c` que seja aplicável a `e` e cujo tipo de resultado esteja em conformidade com `T`. |
| 22 | + |
| 23 | +No segundo caso, é procurada uma conversão `c` que seja aplicável a `e` e cujo resultado contém um membro chamado `m`. |
| 24 | + |
| 25 | +A seguinte operação nas duas listas xs e ys do tipo `List[Int]` é válida: |
| 26 | + |
| 27 | +``` |
| 28 | +xs <= ys |
| 29 | +``` |
| 30 | + |
| 31 | +Assuma que os métodos implícitos `list2ordered` e` int2ordered` definidos abaixo estão no mesmo escopo: |
| 32 | + |
| 33 | +``` |
| 34 | +implicit def list2ordered[A](x: List[A]) |
| 35 | + (implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] = |
| 36 | + new Ordered[List[A]] { /* .. */ } |
| 37 | +
|
| 38 | +implicit def int2ordered(x: Int): Ordered[Int] = |
| 39 | + new Ordered[Int] { /* .. */ } |
| 40 | +``` |
| 41 | + |
| 42 | +O objeto implicitamente importado `scala.Predef` declara vários tipos predefinidos (por exemplo, `Pair`) e métodos (por exemplo, `assert`), mas também várias conversões implícitas. |
| 43 | + |
| 44 | +Por exemplo, ao chamar um método Java que espera um `java.lang.Integer`, você está livre para passar um `scala.Int` em vez disso. Isso ocorre porque `Predef` inclui as seguintes conversões implícitas: |
| 45 | + |
| 46 | +```tut |
| 47 | +import scala.language.implicitConversions |
| 48 | +
|
| 49 | +implicit def int2Integer(x: Int) = |
| 50 | + java.lang.Integer.valueOf(x) |
| 51 | +``` |
| 52 | + |
| 53 | +Para definir suas próprias conversões implícitas, primeiro você deve importar `scala.language.implicitConversions` (ou invocar o compilador com a opção `-language: implicitConversions`). Tal recurso deve ser explicitamente habilitado porque pode se tornar complexo se usado indiscriminadamente. |
0 commit comments