Skip to content

Commit 158edb1

Browse files
authored
Merge pull request scala#1191 from realwunan/implicit-conversions
zh-cn for Scala Tour: implicit-conversions.md
2 parents 63cb58f + 5568762 commit 158edb1

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

_zh-cn/tour/implicit-conversions.md

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
layout: tour
3-
title: Implicit Conversions
3+
title: 隐式转换
44

55
discourse: false
66

@@ -13,3 +13,52 @@ language: zh-cn
1313
next-page: polymorphic-methods
1414
previous-page: implicit-parameters
1515
---
16+
17+
一个从类型 `S` 到类型 `T` 的隐式转换由一个函数类型 `S => T` 的隐式值来定义,或者由一个可转换成所需值的隐式方法来定义。
18+
19+
隐式转换在两种情况下会用到:
20+
21+
* 如果一个表达式 `e` 的类型为 `S`, 并且类型 `S` 不符合表达式的期望类型 `T`
22+
* 在一个类型为 `S` 的实例对象 `e` 中调用 `e.m`, 如果被调用的 `m` 并没有在类型 `S` 中声明。
23+
24+
在第一种情况下,搜索转换 `c`,它适用于 `e`,并且结果类型为 `T`
25+
在第二种情况下,搜索转换 `c`,它适用于 `e`,其结果包含名为 `m` 的成员。
26+
27+
如果一个隐式方法 `List[A] => Ordered[List[A]]`,以及一个隐式方法 `Int => Ordered[Int]` 在上下文范围内,那么对下面两个类型为 `List[Int]` 的列表的操作是合法的:
28+
29+
```
30+
List(1, 2, 3) <= List(4, 5)
31+
```
32+
33+
`scala.Predef.intWrapper` 已经自动提供了一个隐式方法 `Int => Ordered[Int]`。下面提供了一个隐式方法 `List[A] => Ordered[List[A]]` 的例子。
34+
35+
```tut
36+
import scala.language.implicitConversions
37+
38+
implicit def list2ordered[A](x: List[A])
39+
(implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] =
40+
new Ordered[List[A]] {
41+
//replace with a more useful implementation
42+
def compare(that: List[A]): Int = 1
43+
}
44+
```
45+
46+
自动导入的对象 `scala.Predef` 声明了几个预定义类型 (例如 `Pair`) 和方法 (例如 `assert`),同时也声明了一些隐式转换。
47+
48+
例如,当调用一个接受 `java.lang.Integer` 作为参数的 Java 方法时,你完全可以传入一个 `scala.Int`。那是因为 Predef 包含了以下的隐式转换:
49+
50+
```tut
51+
import scala.language.implicitConversions
52+
53+
implicit def int2Integer(x: Int) =
54+
java.lang.Integer.valueOf(x)
55+
```
56+
57+
因为如果不加选择地使用隐式转换可能会导致陷阱,编译器会在编译隐式转换定义时发出警告。
58+
59+
要关闭警告,执行以下任一操作:
60+
61+
*`scala.language.implicitConversions` 导入到隐式转换定义的上下文范围内
62+
* 启用编译器选项 `-language:implicitConversions`
63+
64+
在编译器应用隐式转换时不会发出警告。

0 commit comments

Comments
 (0)