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:274) 在 .lzycompute(:8) ... 28 省略
我期待一个 TP[Trial] 类型的对象,发生了什么?因为 Sym 和 Def 是协变类型。我错过了什么吗?
谢谢