在Scala中查询对象的类或类名时,您将$
在打印输出的尾端获得一个流氓美元符号(" "):
object DollarExample { def main(args : Array[String]) : Unit = { printClass() } def printClass() { println(s"The class is ${getClass}") println(s"The class name is ${getClass.getName}") } }
结果如下:
The class is class com.me.myorg.example.DollarExample$ The class name is com.me.myorg.example.DollarExample$
当然,最后手动删除" $
" 很简单,但我想知道:
为什么会这样?和
无论如何" 配置Scala "省略它?
Jasper-M.. 16
你在这里看到的是scalac编译每object
两个JVM类的事实.最后$的那个实际上是实现实际逻辑的真正的单例类,可能继承自其他类和/或特征.没有$的那个是包含static
转发器方法的类.我认为这对于Java互操作来说很清楚.还因为你实际上需要一种在scala中创建静态方法的方法,因为如果你想在JVM上运行程序,你需要一个public static void main(String[] args)
方法作为入口点.
scala> :paste -raw // Entering paste mode (ctrl-D to finish) object Main { def main(args: Array[String]): Unit = ??? } // Exiting paste mode, now interpreting. scala> :javap -p -filter Main Compiled from "" public final class Main { public static void main(java.lang.String[]); } scala> :javap -p -filter Main$ Compiled from " " public final class Main$ { public static Main$ MODULE$; public static {}; public void main(java.lang.String[]); private Main$(); }
我认为你无能为力.
你在这里看到的是scalac编译每object
两个JVM类的事实.最后$的那个实际上是实现实际逻辑的真正的单例类,可能继承自其他类和/或特征.没有$的那个是包含static
转发器方法的类.我认为这对于Java互操作来说很清楚.还因为你实际上需要一种在scala中创建静态方法的方法,因为如果你想在JVM上运行程序,你需要一个public static void main(String[] args)
方法作为入口点.
scala> :paste -raw // Entering paste mode (ctrl-D to finish) object Main { def main(args: Array[String]): Unit = ??? } // Exiting paste mode, now interpreting. scala> :javap -p -filter Main Compiled from "" public final class Main { public static void main(java.lang.String[]); } scala> :javap -p -filter Main$ Compiled from " " public final class Main$ { public static Main$ MODULE$; public static {}; public void main(java.lang.String[]); private Main$(); }
我认为你无能为力.
虽然提到Java反射机制的所有答案都是正确的,但这仍然无法解决类名末尾的$符号或".type"的问题.
您可以使用Scala classOf函数绕过反射问题.
例:
println(classOf[Int].getSimpleName) println(classOf[Seq[Int]].getCanonicalName) => int => scala.collection.Seq => Seq
通过这种方式,您可以获得与Java相同的结果