2016-05-17 32 views
0

在scala抽象类中,如果要定义上下文绑定,可以简单地使用,例如, [T:ClassTag]在参数,但是这是不可能的特质:用于定义特征中scala上下文绑定的简写

trait Foo[T: ClassTag] 

Error:(11, 35) traits cannot have type parameters with context bounds `: ...' nor view bounds `<% ...' 
trait Foo[T: ClassTag] 
     ^

如果你定义:

trait Foo[T] { 

    implicit def ctg: ClassTag[T] = implicitly[ClassTag[T]] 
} 

object Bar extends Foo[Int] 

那么任何试图读取里面酒吧CTG将触发的StackOverflowError,作为隐参数变成尾递归。

那么允许ctg被定义在一个自动将子类暴露给上下文绑定的特征中的最佳方式是什么?

回答

2

没有一个好方法。上下文绑定对于隐式参数是短暂的,并且特征不具有参数。也就是说,当你写:

class Foo[T : ClasTag] 

编译器去糖您的代码:

class Foo[T](implicit ev: ClassTag[T]) 

这当然不是可能的一个特点。如果您必须工作围绕这一个特征,可以使ClassTag抽象,并迫使扩展类它实现它:

trait Foo[T] { 
    implicit def ctg: ClassTag[T] 
} 

object Bar extends Foo[Int] { 
    implicit val ctg = classTag[Int] 
} 

这看起来稍微一类在中间好,因此在定义Bar时不需要指定Int两次:

trait Foo[T] { 
    implicit def ctg: ClassTag[T] 
} 

class FooImpl[T](implicit val ctg: ClassTag[T]) extends Foo[T] 

object Bar extends FooImpl[Int] 
+0

谢谢。很遗憾不知道它不被支持,希望自动脱糖可以成为未来的一个功能 – tribbloid

相关问题