0

我想测试一些traits从这样的堆栈扩展而来的堆栈:

trait Layer{
  def write(s:String): String
}

每个都以某种方式处理传入的字符串,然后将其传递到下一层,例如:

trait TimeStampLayer { 
  abstract override def write(s:String) = System.nanotime + super.write(s)
} 

我的想法是编写一个带有这样一个夹具的基础测试类:

abstract LayerTest { 

   type L

   val layer = new BaseLayer with L      // BaseLayer would be one that does nothing

} 

每个测试子类都会L用这样的 stackable覆盖trait。这当然行不通,因为没有限制L指定它是一个特征。引用编译器,

L型必须是要混入的特征

我也想到了类似的东西

abstract LayerTest[L <: Layer] {
  //...
}

class TimeStampLayerTest extends LayerTest[TimeStampLayer] {}

但我也不能拘泥于L成为一种特质,或者至少不知道如何去做

有没有办法指定一个类型是一个特征?

4

1 回答 1

1

您的代码的问题比仅仅缺少一个类型约束L来指定它是一个特征更为根本。即使你能做到这一点,编译器应该怎么做?使用new运算符时,类型必须是完全已知的,但这里L是一个抽象类型,所以new BaseLayer with L在调用时完全未知new。因此,编译器无法知道在这里做什么。

您应该做的只是layer抽象,让具体的子类执行实例化。

trait Layer{
  def write(s: String): String
}
trait TimeStampLayer extends Layer{ 
  abstract override def write(s: String) = System.nanoTime + super.write(s)
} 
trait BaseLayer extends Layer {
  def write(s: String) = s
}
abstract class LayerTest { 
   type L <: Layer
   val layer: L // Note that this is abstract
}
class MyTest extends LayerTest {
  class L extends BaseLayer with TimeStampLayer
  val layer = new L // We instantiate it here in the conrete test
}

请注意,减轻我使用的痛苦,您可以通过同名的具体类直接实现抽象类型(class L extends ...

于 2013-07-12T09:45:20.763 回答