路径依赖类型是子类型吗?

2023-12-15

trait A {
  trait B {
    def foo: A.this.B = new B{}
    def bar: A#B      = foo 
    def baz: A.this.B = bar // type mismatch; found : A#B required: A.this.B 
  }
}

我说得对吗A.this.B是路径依赖类型?! (这是我目前的理解) 上面的例子是否意味着类型A.this.B 是一个子类型 A#B? (如果是的话,我想区别在于A.this.B引用了实例A相比A#B哪一个不是?) 有谁知道一个有启发性的解释来解决我对这两种类型的困惑?


优秀的书《Programming in Scala》有相当不错的内容解释:

class Outer {
  class Inner
}

在 Scala 中,内部类使用表达式来寻址Outer#Inner而不是Java的Outer.Inner. The .语法是为对象保留的。例如,假设您实例化了两个类型的对象Outer, 像这样:

val o1 = new Outer
val o2 = new Outer

Here o1.Inner and o2.Inner是两种路径依赖类型(并且它们是不同的类型)。这两种类型都符合更通用的类型(是其子类型)Outer#Inner,它表示具有 Outer 类型的任意外部对象的内部类。相比之下,输入o1.Inner指具有特定外部对象的内部类(从o1)。同样,输入o2.Inner指的是具有不同的、特定的外部对象的内部类(从o2).

在 Scala 中,与在 Java 中一样,内部类实例保存对封闭外部类实例的引用。例如,这允许内部类访问其外部类的成员。因此,如果不以某种方式指定外部类实例,就无法实例化内部类。一种方法是在外部类的主体内实例化内部类。在这种情况下,将使用当前的外部类实例(从此引用)。另一种方法是使用路径相关类型。例如,因为类型 o1.Inner 命名了一个特定的外部对象,所以您可以实例化它:

scala> new o1.Inner
res1: o1.Inner = Outer$Inner@13727f

生成的内部对象将包含对其外部对象的引用,该对象引用自o1。相比之下,因为类型Outer#Inner没有指定任何具体实例Outer,您无法创建它的实例:

scala> new Outer#Inner
<console>:6: error: Outer is not a legal prefix for
  a constructor
       new Outer#Inner
                 ^
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

路径依赖类型是子类型吗? 的相关文章

随机推荐

  • 如何在警报对话框中设置警报文本大小

    默认情况下的警报消息对于屏幕较小的特定设备来说太大 我想将其设置为自定义 dp 我的警报是这样的 OnClickListener addNewItemListener new OnClickListener public void onCl
  • 嵌入仅限 Perl 的模块以及嵌入式 Perl 解释器

    我跟着https perldoc perl org perlembed并成功建立了interp二进制 当我使用static ext 输出目录有 pm文件安装到前缀目录中 如何添加自定义简单 pm模块如TLUtils pm无需将模块文件解压到
  • Python,字符串中字符的具体计数

    我正在尝试计算 python 中字符串出现的次数 我想采用二进制输入 例如 001101 然后计算 1 0 11 00 等的数量 我试图通过使用 count 来实现这一点 但是当我只希望它输出 1 1 和 1 11 时 这会输出有 3 个
  • Python 2.x 可选子解析器 - 错误参数太少

    我一直在尝试设置一个带有两个子解析器的主解析器 以便在单独调用时 主解析器会显示一条帮助消息 def help message print help message import argparse parser argparse Argum
  • C 中二分查找的第一次和最后一次出现

    我试图了解如何修改二进制搜索 使其适用于第一次和最后一次出现 当然我可以在网上找到一些代码 但我试图深入理解 这里是一些基本的非递归二进制搜索我发现 int BinarySearch int array int number of elem
  • 更改快速选择器的悬停颜色

    是否可以通过设置更改快速选择器所选选项的颜色 要保留当前主题并仅更改此颜色 请在设置中找到 工作台 颜色自定义 然后单击 在 settings json 中编辑 然后将以下内容添加到屏幕右侧的用户设置中 workbench colorCus
  • 推荐的c# winform控件包[关闭]

    Closed 这个问题是无关 目前不接受答案 我正在寻找商业 免费推荐的 c winform 控件包 开发快递 我试过了组件一 DevExpress 和Telerik
  • 将 NSString 绘制到 UIImage

    我有一个 NSString 对象 我想将其写入现有的 UIImage 对象 UIImage 对象已经有一些与之关联的图像 我想将字符串写入同一张图像 我如何实现它 编辑 以下是实现编辑 UIImage 并在其上写入文本的基本步骤 从 UII
  • Tomcat 使用 Windows 证书存储进行 SSL

    我使用 Tomcat 9 0 10 并希望使用 Windows 证书存储来保存 SSL 私钥和证书 有这里是另一个线程 这似乎有答案 但是启动 Tomcat 时出现异常 我的 server xml 如下所示
  • 如何捕获Retrofit android中的异常

    我已将类定义如下 我在这里使用了 dagger 和 Retrofit 我正在尝试做什么 我正在努力抓住OfflineException在下面的请求中 如何在主活动中正确捕获它 请求拦截器 java public class RequestI
  • 通过更改 Android 中的应用程序语言来更改默认手机语言?

    有没有办法通过更改应用程序的语言来更改手机的语言 我的意思是 当我更改应用程序的语言时 默认手机语言也会更改 对此有什么想法请在这里分享 提前致谢 我不知道它可以通过编程方式更改 但是在更改应用程序语言后 您也可以要求用户更改设备语言 要求
  • 使用 MySql、PHP 和 ADODB 在准备好的语句中参数化 IN 子句

    我正在编写一些 SQL 并使用 AdoDb 连接到我的数据库并运行查询等 我正在使用参数化查询并遇到了障碍 它们是一种将值数组传递给 AdoDb MySql 中的 in clause 进行参数化的方法 我的问题是 如果我传递一个准备好的字符
  • 在 C/C++ 中编写“指向某物的指针”的好方法

    在 C C 中是否有一种 好 的方法来编写 指向某物的指针 我用来写void foo char str 但有时我发现这很不合逻辑 因为str是 指向 char 的指针 那么附加 应该更合乎逻辑 到类型名称 指针的书写有规则吗 char st
  • VideoView 位于 SurfaceView 之上

    我尝试展示一个VideoView在一个上面SurfaceView 但它不可见 但会对点击做出反应 MediaController 出现并播放声音 该视频似乎是在后面播放的SurfaceView所以我也尝试利用setZOrderMediaOv
  • Facebook 单点登录无法在 Windows 10 设备上运行的 Windows Phone 8.1 应用程序中运行

    我已经提到过this使用 facebook 应用程序实现 facebook 登录的链接 效果很好 从 Facebook 应用程序登录后 它会重定向到我的应用程序 但是当我在 Windows 10 设备上运行此应用程序时 Facebook 应
  • CoreData多对多关系

    CoreData中如何操作多对多关系 例如 我有 2 个实体 食谱和配料 CoreData 像食谱 gt 成分一样链接它们 现在我需要为配方中的每种成分添加属性 计数 我该怎么做 Thanks Core Data 会为您负责对象图一致性维护
  • 未知的服务器标记“ajaxToolkit:HtmlEditorExtender”

    我正在使用 ajaxcontrols 并且所有控件都运行良好但我没有找到任何名为 HtmlEditorExtender 的控件 所以我刚刚在 html 页面中复制了此标签
  • SingleWrite 与 TripleWrite

    我非常清楚何时何地使用 SingleWrite 作为 MQ 中的日志算法是有利的 它有利于高吞吐量 低并发工作负载 当工作负载更加并发时 TripleWrite 的开销就不那么重要了 我不明白并且正在努力寻找任何有关 TripleWrite
  • 应用程序从 Rails 5.2 升级到 6.0 后运行 rspec 时出现 PG::ConnectionBad(连接已关闭)

    我尝试将我的应用程序从 Rails 5 2 升级到 6 0 升级后运行rspec它会引发错误PG ConnectionBad connection is closed 该错误是由表达式引起的ActiveRecord Migration ma
  • 路径依赖类型是子类型吗?

    trait A trait B def foo A this B new B def bar A B foo def baz A this B bar type mismatch found A B required A this B 我说