Skip to content

add new language tour section on type inference #985

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jan 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions _ba/tour/packages-and-imports.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ partof: scala-tour

num: 35
previous-page: named-arguments
next-page: type-inference
---

# Packages and Imports
Expand Down
15 changes: 15 additions & 0 deletions _ba/tour/type-inference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
layout: tour
title: Type Inference
language: ba

discourse: true

partof: scala-tour

num: 36
previous-page: packages-and-imports
---

(this section of the tour has not been translated yet. pull request
with translation welcome!)
1 change: 1 addition & 0 deletions _es/tour/packages-and-imports.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ partof: scala-tour

num: 35
previous-page: named-arguments
next-page: type-inference
---

# Packages and Imports
Expand Down
15 changes: 15 additions & 0 deletions _es/tour/type-inference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
layout: tour
title: Type Inference
language: es

discourse: true

partof: scala-tour

num: 36
previous-page: packages-and-imports
---

(this section of the tour has not been translated yet. pull request
with translation welcome!)
1 change: 1 addition & 0 deletions _ko/tour/packages-and-imports.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ partof: scala-tour

num: 35
previous-page: named-arguments
next-page: type-inference
---

# Packages and Imports
Expand Down
15 changes: 15 additions & 0 deletions _ko/tour/type-inference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
layout: tour
title: Type Inference
language: ko

discourse: true

partof: scala-tour

num: 36
previous-page: packages-and-imports
---

(this section of the tour has not been translated yet. pull request
with translation welcome!)
1 change: 1 addition & 0 deletions _pl/tour/packages-and-imports.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ partof: scala-tour

num: 35
previous-page: named-arguments
next-page: type-inference
---

# Packages and Imports
Expand Down
15 changes: 15 additions & 0 deletions _pl/tour/type-inference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
layout: tour
title: Type Inference
language: pl

discourse: true

partof: scala-tour

num: 36
previous-page: packages-and-imports
---

(this section of the tour has not been translated yet. pull request
with translation welcome!)
1 change: 1 addition & 0 deletions _pt-br/tour/packages-and-imports.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ partof: scala-tour

num: 35
previous-page: named-arguments
next-page: type-inference
---

# Packages and Imports
Expand Down
15 changes: 15 additions & 0 deletions _pt-br/tour/type-inference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
layout: tour
title: Type Inference
language: pt-br

discourse: true

partof: scala-tour

num: 36
previous-page: packages-and-imports
---

(this section of the tour has not been translated yet. pull request
with translation welcome!)
1 change: 1 addition & 0 deletions _tour/packages-and-imports.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ partof: scala-tour

num: 35
previous-page: named-arguments
next-page: type-inference
---

# Packages and Imports
Expand Down
73 changes: 73 additions & 0 deletions _tour/type-inference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
layout: tour
title: Type Inference

discourse: true

partof: scala-tour

num: 36
previous-page: packages-and-imports
---

The Scala compiler can often infer the type of an expression so you don't have to declare it explicitly.

## Omitting the type

```tut
val businessName = "Montreux Jazz Café"
```
The compiler can detect that `businessName` is a String. It works similarly with methods:

```tut
def squareOf(x: Int) = x * x
```
The compiler can infer that the return type is an `Int`, so no explicit return type is required.

For recursive methods, the compiler is not able to infer a result type. Here is a program which will fail the compiler for this reason:

```tut:fail
def fac(n: Int) = if (n == 0) 1 else n * fac(n - 1)
```

It is also not compulsory to specify type parameters when [polymorphic methods](polymorphic-methods.html) are called or [generic classes](generic-classes.html) are instantiated. The Scala compiler will infer such missing type parameters from the context and from the types of the actual method/constructor parameters.

Here are two examples:

```tut
case class MyPair[A, B](x: A, y: B);
val p = MyPair(1, "scala") // type: MyPair[Int, String]

def id[T](x: T) = x
val q = id(1) // type: Int
```

The compiler uses the types of the arguments of `MyPair` to figure out what type `A` and `B` are. Likewise for the type of `x`.

## Parameters

The compiler never infers method parameter types. However, in certain cases, it can infer anonymous function parameter types when the function is passed as argument.

```tut
Seq(1, 3, 4).map(x => x * 2) // List(2, 6, 8)
```

The parameter for map is `f: A => B`. Because we put integers in the `Seq`, the compiler knows that `A` is `Int` (i.e. that `x` is an integer). Therefore, the compiler can infer from `x * 2` that `B` is type `Int`.

## When _not_ to rely on type inference

It is generally considered more readable to declare the type of members exposed in a public API. Therefore, we recommended that you make the type explicit for any APIs that will be exposed to users of your code.

Also, type inference can sometimes infer a too-specific type. Suppose we write:

```tut
var obj = null
```

Then we can't then go on and make this reassignment:

```tut:fail
obj = new AnyRef
```

It won't compile, because the type inferred for `obj` was `Null`. Since the only value of that type is `null`, it is impossible to assign a different value.