【问题标题】:Trait that, when mixed in, turns a class into a final class混入后将类变成最终类的特征
【发布时间】:2016-06-09 08:00:30
【问题描述】:

在 Scala 中,是否有可能在 final 中拥有一个 trait 来将其混入其中的类?

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

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

例子:

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

这个函数不仅需要T来实现/混合MyTrait,而且假设它包含如果T是一个基类并且实际上作为t是一个子类传入的逻辑不起作用的T。例如myFun[A](new B)

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

我能找到的最接近的方法是确保 T 是最终的,最好的方法是在 MyTrait 中写一些东西来强制执行它。

所以我的问题。

另外,我如何确保T 是一个案例类?

【问题讨论】:

标签: scala traits


【解决方案1】:

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

【讨论】:

  • 为了同样的目的,我可以使用注释而不是特征
  • 您需要对要设为 final 的类进行注释,在这种情况下,将其设为 final 会更容易。
  • 嗯,不完全是,该注释可能还有其他含义,除此之外,使类成为最终的。但我更喜欢实际的代码而不是使用宏。
【解决方案2】:

这种方法怎么样:

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 传递给该函数,而不是它的子函数。

【讨论】:

  • 但是A 是一个特定的类型,我需要它是通用的。我需要确保t 正是T 的一个实例,无论是T,还是任何T &lt;: MyTrait
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多