WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Scala · Advanced · question 54 of 100

What are type projections in Scala, and how are they different from path-dependent types?

📕 Buy this interview preparation book: 100 Scala questions & answers — PDF + EPUB for $5

In Scala, type projections and path-dependent types are distinct but related concepts that allow you to express more precise relationships between types and objects. Let’s explore each concept separately and then discuss their differences.

**Type Projections:**

Type projection is a way to reference an inner type of another type in a more general way, regardless of the specific instance of the outer type. In the following example, we have an outer class ‘Outer‘ that has an inner class ‘Inner‘:

class Outer {
  class Inner
}

Now, we want to refer to the ‘Inner‘ type without specifying a particular ‘Outer‘ instance. We use type projection for this:

type AnyInner = Outer#Inner

Here, ‘AnyInner‘ refers to any instance of the ‘Inner‘ type, no matter from which ‘Outer‘ instance it comes. Note that using type projection makes the type less precise because we’re no longer associating it with a specific ‘Outer‘ instance.

**Path-dependent Types:**

Path-dependent types, on the other hand, establish a more precise relationship between the inner type and its specific outer instance. This means that the inner type depends on the path through which it is accessed. Take the ‘Outer‘ and ‘Inner‘ classes from our previous example:

class Outer {
  class Inner
}

val outer1 = new Outer
val outer2 = new Outer

With path-dependent types, the type ‘outer1.Inner‘ would be distinct from ‘outer2.Inner‘. This allows us to express a more precise relationship between the ‘Inner‘ type and the specific instance of ‘Outer‘:

val inner1: outer1.Inner = new outer1.Inner
val inner2: outer2.Inner = new outer2.Inner

// This will result in a compile-time error because inner1 and inner2 have different path-dependent types
// val inner3: outer1.Inner = new outer2.Inner

**Differences between Type Projections and Path-dependent Types:**

The main difference between type projections and path-dependent types is how they relate to the outer instance:

1. Type projection lets you refer to an inner type in a more general way, without specifying a particular outer instance: ‘Outer#Inner‘. It’s less precise and can be used to refer to an ‘Inner‘ type regardless of the specific ‘Outer‘ instance it comes from.

2. Path-dependent types associate the inner type with a specific outer instance, making the types more precise: ‘outer1.Inner‘. The type of the inner instance depends on the outer instance it’s associated with and cannot be switched between different outer instances without a type cast.

In summary, type projections are more general and less precise, whereas path-dependent types have a stronger coupling between the inner type and the specific outer instance. While type projections can be convenient in some use cases, they have been deprecated in Scala 3 (Dotty) in favor of path-dependent types and type refinements, which offer more precise and expressive type relationships.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Scala interview — then scores it.
📞 Practice Scala — free 15 min
📕 Buy this interview preparation book: 100 Scala questions & answers — PDF + EPUB for $5

All 100 Scala questions · All topics