在Scala中使用对象实例化一个抽象类型

时间:2017-11-02 10:41:18

标签: scala

有没有办法在Scala中实例化带有对象的抽象类型? 我的意思是这样的:

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 */
}

1 个答案:

答案 0 :(得分:1)

问题在于

中的with
type ProcessorType = RequestTrait with ResponseTrait

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

实际上是不同的。第一个定义了复合类型;第二个没有,它只是分开(可选)类和特征。它只允许一个类和特征,而不是任意类型。因此new ProcessorType { ... }不合法。

这种双关语是有效的,因为第二种形式创建的类是所有列出的类/特征的子类型,也是第一种形式创建的复合类型的子类型,但它仍然只是双关语。