【问题标题】:Scala: self type annotationScala:自我类型注释
【发布时间】:2013-11-06 20:11:37
【问题描述】:

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

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

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

更新:抱歉,我似乎不擅长提问。 我想知道的是这种奇怪的特殊情况是否有意义。 D类永远无法实例化的情况,如 1.我不能混入String,因为它不是tarit。 2. 我不能混入 D,因为.. 3.我不能扩展String,因为它是final的。

【问题讨论】:

    标签: scala self-type


    【解决方案1】:

    self类型注解一般有两个用途:

    1. 强制执行某个基类/特征并确保您的类或特征只能由该类型继承或混合到该类型中,并且
    2. 在实现内壳时参考外壳。 (如果不是这种语法,'this' 指的是什么?)

    我不确定我是否理解您的示例或其背后的原因。详细点?

    【讨论】:

      【解决方案2】:
      trait Table
      trait Desert
      trait Meal
      
      class Pancake extends Desert
      class Spaghetti extends Meal
      class Woodentable extends Table
      

      假设您想确保现有的类混合在您使用的那些依赖项中:

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

      现在,在 Restaurant 中混合的每个类(或特征)都必须提供以下依赖项。例如,这用于蛋糕图案。如果这些依赖项中的任何一个不存在,编译器将在编译时报错。

      【讨论】:

      • 我相信你的意思是编译器会在 compile 时抱怨。
      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多