Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 检查类型子类型时结果不一致_Scala_Scala Reflect - Fatal编程技术网

Scala 检查类型子类型时结果不一致

Scala 检查类型子类型时结果不一致,scala,scala-reflect,Scala,Scala Reflect,有时,当我检查一个类是否扩展了一个特性时,会得到不一致的结果。我使用的是scala 2.12.8 我的项目使用ru.Type动态构建操作链。一个操作的输出必须与下一个操作的输入一致 在链接两个操作之前,我使用以下方法检查类型是否兼容: def checkFrom(t:ru.Type):Boolean=t抱歉,无法复制。即使使用我的示例代码?对我来说,平均20%的运行失败。是的,现在我可以了,谢谢。最初Scala反射不是线程安全的。自2.11以来,它被认为是线程安全的,但显然有时仍然不是。 def

有时,当我检查一个类是否扩展了一个特性时,会得到不一致的结果。我使用的是scala 2.12.8

我的项目使用
ru.Type
动态构建操作链。一个操作的输出必须与下一个操作的输入一致

在链接两个操作之前,我使用以下方法检查类型是否兼容:


def checkFrom(t:ru.Type):Boolean=t抱歉,无法复制。即使使用我的示例代码?对我来说,平均20%的运行失败。是的,现在我可以了,谢谢。最初Scala反射不是线程安全的。自2.11以来,它被认为是线程安全的,但显然有时仍然不是。
def checkFrom(t: ru.Type): Boolean = {
  val expectedType = ru.typeOf[ExpectedTrait[_, _, _]]
  val r = t <:< expectedType
  if (!r) println(s"$t is not a $expectedType (${t <:< expectedType})")
  r
}
import scala.reflect.runtime.{universe => ru}

abstract class BaseClass[A, This <: BaseClass[A, This]](a: A) {
  def newInstance(a: A): This
}

abstract class ExtClass[A, This <: ExtClass[A, This]](a: A) extends BaseClass[A, This](a)

class MyClass(n: Int) extends ExtClass[Int, MyClass](n) {
  override def newInstance(a: Int): MyClass = new MyClass(a)
}

object ReflectionTest extends App {
  def test[T: ru.TypeTag](tpe: ru.Type): Boolean = {
    val r = tpe <:< ru.typeOf[T]
    if (!r) println(s"test fails: ${tpe <:< ru.typeOf[T]}")
    r
  }
  println((0 until 1000).par.forall(_ => test[BaseClass[_, _]](ru.typeOf[MyClass])))
}
test fails: true
test fails: true
false