gpt4 book ai didi

scala - 在这个使用泛型的例子中,asInstanceOf 有什么问题吗?

转载 作者:行者123 更新时间:2023-12-01 10:44:56 29 4
gpt4 key购买 nike

考虑这个(有点做作的)例子:

abstract class Obj[A, B] {
def id: Long
def parent: B
}

abstract class TopLevel[A] extends Obj[A, A] {
def parent: A = this.asInstanceOf[A] // How terrible is this?
}

abstract class AbsChild[A, B] extends Obj[A, B] {
def parent: B
}

case class Top(id: Long) extends TopLevel[Top]

case class Child(id: Long, parent: Top) extends AbsChild[Child, Top]

为了描绘一个更好的画面,将 AbsChild 想象成文件系统上的某种目录,将 TopLevel 想象成 AbsChild 的物理驱动器> 属于。所以 parent 实际上并不是指对象的直接父级(比如包含它的目录),而是对树中顶级对象的引用。

在某些应用程序中,我将处理一个 List[Obj[A, B]],其中不能立即知道 Obj 是什么.在这种情况下,即使是 TopLevel 也有一个 parent 会很好,它应该只返回对自身的引用。这就是我的问题。

TopLevel 定义 def parent: A = this 不起作用:

<console>:14: error: type mismatch;
found : TopLevel.this.type (with underlying type TopLevel[A])
required: A

但是 def parent: A = this.asInstanceOf[A] 可以,并且似乎在实践中可以正常运行。

scala> val top = Top(1)
top: Top = Top(1)

scala> val child = Child(1, top)
child: Child = Child(1,Top(1))

scala> top.parent
res0: Top = Top(1)

scala> child.parent
res1: Top = Top(1)

但这真的可以吗?使用 asInstanceOf[A] 感觉非常脏,让我想知道它是否会以某种方式因 ClassCastException 而失败。

最佳答案

如果您有一个不是 ATopLevel[A] 子类,您将得到一个 ClassCastException。为避免强制转换,您应该使用 self 类型(我不确定这是否是正确的名称):

abstract class TopLevel[A] extends Obj[A, A] {
this: A =>
def parent: A = this
}

关于scala - 在这个使用泛型的例子中,asInstanceOf 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551442/

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