加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 结构类型细化和类型相等

发布时间:2020-12-16 18:50:59 所属栏目:安全 来源:网络整理
导读:我偶然发现了Type.=:=在应用于类型再生时的令人费解的行为. 考虑: import reflect.runtime.universe._type T1 = AnyRef { def apply( name: String ): Unit def foo: String}type Base = { def apply( name: String ): Unit }type T2 = Base { def foo: St
我偶然发现了Type.=:=在应用于类型再生时的令人费解的行为.
考虑:

import reflect.runtime.universe._
type T1 = AnyRef {
  def apply( name: String ): Unit
  def foo: String
}

type Base = { def apply( name: String ): Unit }
type T2 = Base {
  def foo: String
}

鉴于Base是类型细化的别名,我希望通过添加成员foo来进一步细化它
产生相同的类型,就好像我在Base中定义了foo一样.

换句话说,我希望T1和T2表示完全相同的类型.

在大多数情况下,scalac似乎同意.
通过示例,我可以传递T2的实例,其中期望T1的实例:

def f( x: T1 ){}
f( null: T2 ) // scalac does not complain here

反之亦然:

def g( x: T2 ){}
g( null: T1 ) // scalac is still happy

我也可以要求提供T1 =:= T2的证据并且编译也很好:

implicitly[T1 =:= T2]

但是,使用scala反射我会得到完全不同的结果:

scala> typeOf[T1] =:= typeOf[T2]
res2: Boolean = false

那么这是一个scala反射错误(我猜是这样)或者是否有一个根本原因(否则为技术)为什么typeOf [T1] =:= typeOf [T2]会返回false?

解决方法

可悲的是,它似乎是这个错误: https://issues.scala-lang.org/browse/SI-8177

从好的方面来看……看起来正在积极开展工作以解决它:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读