特写是,当混入时,将一个类变成最后一个类

时间:2016-06-09 08:00:30

标签: scala traits

在Scala中,是否有可能具有一个特性,使其成为final中混合的类?

如果这个类混合了一个特征,我需要阻止从类中继承,但我不确定这是否可行。也许我需要一个宏。

或者一个技巧,比如在特征中定义final成员以避免混合该特征两次,但这不是我需要实现的。

示例:

trait MyTrait
class A extends MyTrait
class B extends A
def myFun[T <: MyTrait](t: T)

此函数不仅需要T来实现/ mixin MyTrait,而且假设它包含如果T是基类而实际传递的内容不起作用的逻辑因为tT的孩子。例如myFun[A](new B)

显然,这是一个极端情况,但也许有一种方法可以确保/指定作为参数传递的t必须完全属于T类型而不是其中一个子节点。我不知道这是否可能,这将是最好的解决方案。

我能找到的最接近的事情是确保T是最终的,最好的是在MyTrait中写一些强制执行它的内容。

所以我的问题。

或者,我如何确保T是一个案例类?

2 个答案:

答案 0 :(得分:0)

不,不是。宏也无济于事:你不能通过扩展内容来触发宏,只能通过注释或调用方法(据我所知)。

答案 1 :(得分:0)

这种方法怎么样:

trait MyTrait
class A extends MyTrait
class B extends A

def myFun[T](t: T)(implicit ev: T =:= A) = ()
defined function myFun
@ myFun(new A)

@ myFun(new B)
Main.scala:61: Cannot prove that cmd2.B =:= cmd1.A.
myFun(new B)
     ^
Compilation Failed

这与你的要求有点不同,因为它与特质无关。它只是强制你只能将类型A传递给该函数,而不是它的子函数。