0
    import scala.annotation.unchecked.uncheckedVariance
    import scala.collection.immutable.Queue
    import scala.collection.mutable.ListBuffer


  abstract class Exp[+T:Manifest] { // constants/symbols (atomic)
    def tp: Manifest[T @uncheckedVariance] = manifest[T] //invariant position! but hey...
  }
  case class Sym[+T:Manifest](val id: Int) extends Exp[T] {
  }
  abstract class Def[+T] { // operations (composite)
    override final lazy val hashCode = scala.runtime.ScalaRunTime._hashCode(this.asInstanceOf[Product])
  }
  abstract class Stm
  case class TP[+T](sym: Sym[T], rhs: Def[T]) extends Stm

  abstract class Trial{
  }

  class M1() extends Trial{}
  class M2() extends Trial{}

  class N1() extends Def[M1]{}
  class N2() extends Def[M2]{}

  TP(Sym[M1]{4},new N1())

这给出了以下错误:

scala> TP(Sym[M1]{4},new N1()) java.lang.ClassCastException: class N1 cannot be cast to class scala.Product (N1 is in the unnamed module of loader scala.tools.nsc.interpreter.IMain $TranslatingClassLoader @2098d37d; scala.Product 在 Def.hashCode 的加载程序'bootstrap'的未命名模块中
$lzycompute(:13) at Def.hashCode(:13) at java.base/java.lang.Object.toString(Object .java:246) 在 java.base/java.lang.String.valueOf(String.java:2951) 在 java.base/java.lang.StringBuilder.append(StringBuilder.java:168) 在 scala.collection.IterableOnceOps。 addString(IterableOnce.scala:1194)
at scala.collection.IterableOnceOps.addString$(IterableOnce.scala:1186)
at scala.collection.AbstractIterator.addString(Iterator.scala:1279)
在 scala.collection.IterableOnceOps.mkString(IterableOnce.scala:1136) 在 scala.collection.IterableOnceOps.mkString$(IterableOnce.scala:1134) 在 scala.collection.AbstractIterator.mkString(Iterator.scala:1279)
在 scala.runtime .ScalaRunTime$._toString(ScalaRunTime.scala:159) at TP.toString(:18) at scala.runtime.ScalaRunTime$.inner$1(ScalaRunTime.scala:261) at scala.runtime.ScalaRunTime$.stringOf(ScalaRunTime.scala :266) 在 scala.runtime.ScalaRunTime$.replStringOf(ScalaRunTime.scala:27​​4) 在 .lzycompute(:8) ... 28 省略

我期待一个 TP[Trial] 类型的对象,发生了什么?因为 Sym 和 Def 是协变类型。我错过了什么吗?

谢谢

4

1 回答 1

1

在 Scastie,它不能像https://scastie.scala-lang.org/tCD4HahgTqO4WTnlGcfWqQ一样重现,但可以像https://scastie.scala-lang.org/L46PWLF2S5i4d1IGoT6UuQ一样重现

ClassCastException只有当我删除lazyfor时,我才能在本地复制Def#hashCode

协方差无关紧要。

this.asInstanceOf[Product]您尝试将Def'sthis转换为Product. 创建new N1()时它是 currentDefthis.

new N1()作为 class 的值N1不能转换为Product因为N1doesn't extend Product

默认情况下,Scala 中的类不扩展Product,案例类可以。

修复ClassCastException它就足以制作N1一个案例类。

于 2020-09-30T22:37:36.627 回答