首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Aux模式进行类型选择时发生反射呼叫

使用Aux模式进行类型选择时发生反射呼叫
EN

Stack Overflow用户
提问于 2021-01-26 15:38:22
回答 1查看 25关注 0票数 0

考虑以下示例:

代码语言:javascript
复制
sealed trait Granularity
object Granularity {

  case object Full extends Granularity

  sealed trait Partial extends Granularity {
    type GranularityKey
  }

  case object StringGranularity extends Partial {
    override type GranularityKey = String
  }
}

sealed trait Test{
  type T <: Granularity
}
object Test {

  type Aux[TT <: Granularity] = Test{ type T = TT }

  case object Cmp extends Test{
    override type T = StringGranularity.type
  }

  case object Fll extends Test{
    override type T = Full.type
  }
}
     
case class Tst[Gran <: Partial, T <: Test.Aux[Gran]](t: T#T#GranularityKey)
                                                          ^
                                                          |___Advanced language feature: reflective call

关于某些反射呼叫的想法信号出现在类型选择T#T#GranularityKey中。

你能解释一下这里到底会发生什么反射调用吗?那么它实际上是类型安全的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-26 15:59:52

也许,由于next type Aux[TT <: Granularity] = Test{ type T = TT } -基本上您在这里说有一些Test应该在其中定义了类型别名T。我认为这里的编译器逻辑类似于Scala实现中的Duck Typing。例如,您可以定义type Foo{ def bar(): Unit},然后尝试下一步

代码语言:javascript
复制
class FooImpl {
  def bar(): Unit = println("Bar")
}
val foo: Foo = new FooImpl
foo.bar()

正如您所看到的,FooImpl不会继承任何东西,但仍然可以为类型Foo赋值,因为它满足具有方法bar的条件,但由于foo.bar()限制或字节码限制- JVM调用将是反射的,这意味着通过Java反射API。但是,这种方法是完全类型安全的。

也许,基于此的想法也认为Test特征中的类型别名T将通过反射API调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65897427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档