在Scala中,是否有可能具有一个特性,使其成为final
中混合的类?
如果这个类混合了一个特征,我需要阻止从类中继承,但我不确定这是否可行。也许我需要一个宏。
或者一个技巧,比如在特征中定义final
成员以避免混合该特征两次,但这不是我需要实现的。
示例:
trait MyTrait
class A extends MyTrait
class B extends A
def myFun[T <: MyTrait](t: T)
此函数不仅需要T
来实现/ mixin MyTrait
,而且假设它包含如果T
是基类而实际传递的内容不起作用的逻辑因为t
是T
的孩子。例如myFun[A](new B)
。
显然,这是一个极端情况,但也许有一种方法可以确保/指定作为参数传递的t
必须完全属于T
类型而不是其中一个子节点。我不知道这是否可能,这将是最好的解决方案。
我能找到的最接近的事情是确保T
是最终的,最好的是在MyTrait
中写一些强制执行它的内容。
所以我的问题。
或者,我如何确保T
是一个案例类?
答案 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
传递给该函数,而不是它的子函数。