Scala:自我类型注释

时间:2013-11-06 20:11:37

标签: scala self-type

(试图通过探测边界来理解自我类型的使用。)

这不能被实例化(D和String是类,但其中一个必须混入。加上String是final。)。但它还有其他用途吗?

class D { 
    foo: String => 
    def f2 = foo.substring(1) 
}

更新:抱歉,我似乎不善于提问。 我想知道的是这个奇怪的特殊情况是否有意义。 D类永远无法实例化的情况 我不能混合使用String,因为它不是tarit。 我不能混在D中,因为...... 3.我无法扩展String,因为它是最终的。

2 个答案:

答案 0 :(得分:5)

自我类型注释通常有两个目的:

  1. 强制执行某个基类/特征,并确保您的类或特征只能由该类型继承或混合,并且
  2. 实施内壳时参考外壳。 (如果不是这种语法,'这个'指的是什么?)
  3. 我不确定我理解你的例子或背后的原因。详细点?

答案 1 :(得分:4)

trait Table
trait Desert
trait Meal

class Pancake extends Desert
class Spaghetti extends Meal
class Woodentable extends Table

假设您要确保现有的Class混合使用的依赖项:

trait Restaurant {
self: Table with Desert with Meal =>
def foo():Unit ...
}

现在,在餐厅混合的每个类(或特征)都必须提供以下依赖关系。例如,这用于蛋糕模式。如果不存在任何这些依赖项,编译器将在编译时进行抱怨。