Pavel
Pavel

Reputation: 11

Instantiatin an abstract type with an object in Scala

Is there a way to instantiate an abstract type with an object in Scala? What I mean is something like this:

trait Processor {
  /* 1. defining a type shortcut */
  type ProcessorType = RequestTrait with ResponseTrait

  /* 2. defining a method with default implementation */
  def retry = new ProcessorType {
    override def retry = None
  }
  /* 3. Compilation fails */
  def reRetry = new RequestTrait with ResponseTrait {
    override def retry = None
  }
  /* 4. This one works correctly */
}

Upvotes: 1

Views: 49

Answers (1)

Alexey Romanov
Alexey Romanov

Reputation: 170713

The issue is that the withs in

type ProcessorType = RequestTrait with ResponseTrait

and

class X extends RequestTrait with ResponseTrait { ... }
new RequestTrait with ResponseTrait { ... }

are actually different. The first defines a compound type; the second doesn't, it just separates (optional) class and traits. And it only allows a class and traits, not arbitrary types. So new ProcessorType { ... } isn't legal.

This pun works because the class created by the second form is a subtype of all listed classes/traits and so of the compound type created by the first form, but it's still just a pun.

Upvotes: 1

Related Questions