Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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_Reflection_Interpreter - Fatal编程技术网

Scala反射在解释器和编译代码上的行为不同

Scala反射在解释器和编译代码上的行为不同,scala,reflection,interpreter,Scala,Reflection,Interpreter,我有 编译为.class文件。下面是加载它们的代码: trait T class C extends T 当我在Scala解释器中运行加载代码时,结果是 val loader = ScalaClassLoader fromURLs (/* List[URL] */) val classB = loader.tryToInitializeClass("B") getOrElse (/* throw something */) println(classB.asInstanceOf[Class[_

我有

编译为.class文件。下面是加载它们的代码:

trait T
class C extends T
当我在Scala解释器中运行加载代码时,结果是

val loader = ScalaClassLoader fromURLs (/* List[URL] */)
val classB = loader.tryToInitializeClass("B") getOrElse (/* throw something */)
println(classB.asInstanceOf[Class[_]].getInterfaces)
但是当加载代码编译成.class文件并运行时,我得到了

res1: Array[java.lang.Class[_]] = Array(interface T, interface scala.ScalaObject)
请告诉我如何让编译后的加载代码产生与解释器一样好的结果。

Arrayinterface T、接口scala.ScalaObject和[Ljava.lang.Class;@1b8e059是同一类型的对象,只是以不同的方式打印出来

当你调用数组上的toString时,数组[Class[\u]]会像[Ljava.lang.Class;@1b8e059]一样打印出来

请尝试以下操作:

[Ljava.lang.Class;@1b8e059
REPL在打印表达式的值时非常有用。如果要在编译的代码中打印有用的字符串,例如:

scala> val f = Array[Class[_]](classOf[Map[String, String]], classOf[Object])
f: Array[java.lang.Class[_]] = Array(interface scala.collection.immutable.Map, class java.lang.Object)

scala> f.toString
res1: java.lang.String = [Ljava.lang.Class;@407e62
Arrayinterface T、接口scala.ScalaObject和[Ljava.lang.Class;@1b8e059是同一类型的对象,只是打印方式不同而已

当你调用数组上的toString时,数组[Class[\u]]会像[Ljava.lang.Class;@1b8e059]一样打印出来

请尝试以下操作:

[Ljava.lang.Class;@1b8e059
REPL在打印表达式的值时非常有用。如果要在编译的代码中打印有用的字符串,例如:

scala> val f = Array[Class[_]](classOf[Map[String, String]], classOf[Object])
f: Array[java.lang.Class[_]] = Array(interface scala.collection.immutable.Map, class java.lang.Object)

scala> f.toString
res1: java.lang.String = [Ljava.lang.Class;@407e62

您确定在解释的会话中执行了println吗?因为您编写的第一个结果看起来可疑地像是显示刚才的结果的解释器 没有println res1的classB.asInstanceOf[Class[\u]].getInterfaces非常有说服力


另一方面,神秘的[Ljava.lang.Class;@1b8e059是数组的toString。所以,你的问题就是,toString。如果你做一些像printlnyourResult.mkString这样的事情,那应该会更好。在REPL中,结果显示比普通的toString好。你确定你在解释的会话中执行了println吗?因为你写的第一个结果看起来It’很可疑,就像解释程序显示的结果一样 没有println res1的classB.asInstanceOf[Class[\u]].getInterfaces非常有说服力

另一方面,神秘的[Ljava.lang.Class;@1b8e059是数组的toString。所以你的问题就是,toString。如果你像printlnyourResult.mkString这样做,那应该更好。在REPL中,结果显示比普通的toString更好

scala> f.toList.toString
res4: String = List(interface scala.collection.immutable.Map, class java.lang.Object)
不是来自println表达式,而是来自REPL。如果输入的表达式返回除Unit以外的任何内容,则REPL将打印该对象的toString方法的名称、类型和结果

res1: Array[java.lang.Class[_]] = Array(interface T, interface scala.ScalaObject)
线路

scala> f.toList.toString
res4: String = List(interface scala.collection.immutable.Map, class java.lang.Object)
不是来自println表达式,而是来自REPL。如果输入的表达式返回除Unit以外的任何内容,则REPL将打印该对象的toString方法的名称、类型和结果

res1: Array[java.lang.Class[_]] = Array(interface T, interface scala.ScalaObject)

谢谢,这是我想要的方式。谢谢,这是我想要的方式。