全局/本地命名冲突的解决方法

问题描述

假设我有这两个类:

class A {
  def foo(i: String) = println(s"${i}")
  def foo(i: String,j: Int) = println(s"${i} ${j}")
}

class B {
  def foo(i: Int) = println(s"${i}")
  def foo(i: Int,j: String) = println(s"${i} ${j}")
}

我有一个全局变量和类中的方法同名的变量:

val inst = A()

abstract class AppB extends App { 
  def inst = B()
}

我扩展了上述内容

object MyApp extends AppB {
  // Should reference A
  inst.foo("s11")
  inst.foo("s22",11)
  
  // Should reference B
  inst.foo(33)
  inst.foo(44,"s33")
}

假设我不想重命名,有没有办法:

  • 引用全局 val inst?
  • "Shadow" def inst 不知何故,所以我只能使用全局 val inst 一个

解决方法

来自https://dotty.epfl.ch/docs/reference/dropped-features/package-objects.html

如果源文件 src.scala 包含此类顶级定义,它们将被放入名为 src$package 的合成对象中

也许在这种情况下使用“自动生成的”object 名称访问 val inst 可以吗?