当前位置:  开发笔记 > 编程语言 > 正文

为什么Scala在类名末尾放置一个美元符号?

如何解决《为什么Scala在类名末尾放置一个美元符号?》经验,为你挑选了2个好方法。

在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$();
}

我认为你无能为力.



1> Jasper-M..:

你在这里看到的是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$();
}

我认为你无能为力.



2> 小智..:

虽然提到Java反射机制的所有答案都是正确的,但这仍然无法解决类名末尾的$符号或".type"的问题.

您可以使用Scala classOf函数绕过反射问题.

例:

println(classOf[Int].getSimpleName)
println(classOf[Seq[Int]].getCanonicalName)
=> int
=> scala.collection.Seq
=> Seq

通过这种方式,您可以获得与Java相同的结果

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有