gpt4 book ai didi

scala - 从外部访问抽象类型成员

转载 作者:行者123 更新时间:2023-12-04 15:53:33 26 4
gpt4 key购买 nike

当使用抽象类型成员时,如果不使用 asInstanceOf 就无法从外部使用该类型,还有其他选择吗?为什么抽象类型不让自己被“覆盖”以便它知道它是 Int 还是 String?

scala> trait Param { type A
| val x:A
| def get:A = x
| }

scala> case class IParam(override val x:Int) extends Param {type A = Int}
defined class IParam

scala> case class SParam(override val x:String) extends Param {type A = String}
defined class SParam

scala> val s = Set[Param](IParam(1), SParam("s"))
s: scala.collection.immutable.Set[Param] = Set(IParam(1), SParam(s))

scala> val y:Int = s.head.get
<console>:26: error: type mismatch;
found : Param#A
required: Int
val y:Int = s.head.get

最佳答案

编译器在对 y 进行类型检查时不会查看 s 的定义,而只会查看其类型。所以它只知道s.head是一个Param,而它的A是抽象的。要让编译器知道 s.head.getInt,它必须知道 s.headIParam .

或者你可以这样看:如果这个类型检查过,那么你可以将 s 的定义更改为 val s = Set[Param](SParam("s")) 不改变任何类型。但是很明显 y: Int 不应该进行类型检查。

关于scala - 从外部访问抽象类型成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35540678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com