首页 > 解决方案 > 无法从导入中隐藏 Scala 类

问题描述

写了这段代码

scala> import scala.collection.immutable.{Stream => _}
scala> Stream(1, 2, 3)
res0: scala.collection.immutable.Stream[Int] = Stream(1, ?)

但是第二行不应该失败吗?因为我从第 1 行的导入中隐藏了 Stream 类?为什么它仍然可见?

我也试过

scala> import scala.collection.immutable.{Stream => DoNotUse}
import scala.collection.immutable.{Stream=>DoNotUse}

scala> Stream(1, 2, 3)
res1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

同样,这仍然是可见的。

标签: scala

解决方案


-Yimports这是2.13 中的新示例。

$ cat S.scala

package mystream

class Stream[A]

object MyPredef {
  type Stream[A] = mystream.Stream[A]
}

列表中稍后的导入会影响较早的导入:

$ scala -Yimports:java.lang,scala,scala.Predef,mystream.MyPredef
Welcome to Scala 2.13.0 (OpenJDK 64-Bit Server VM 11.0.1)

scala> new Stream[Int]
res0: mystream.Stream[Int] = mystream.Stream@65fe2691

它不像假设的语法那么方便

-Yimports:java.lang._,scala.{Stream=>_, _},scala.Predef._

这将更直接地支持您的用例。

或者,通常将别名放在封闭的包对象中:

package object mystuff {
  type Stream[A] = mystream.Stream[A]
}

scala> :pa
// Entering paste mode (ctrl-D to finish)

package mystuff {
  class C { def f = new Stream[Int] }
}

// Exiting paste mode, now interpreting.


scala> new mystuff.C().f
res1: mystream.Stream[Int] = mystream.Stream@715fa8c5

但别名的范围仅限于这些子包,而不是任何编译单元。


推荐阅读