无法从导入隐藏Scala类

时间:2019-01-10 17:26:36

标签: 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, ?)

同样,这仍然可见。

3 个答案:

答案 0 :(得分:0)

下面是一个示例,其中包含2.13中新的-Yimports

$ 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

但是别名的作用域是那些子包,而不是任何编译单元。

答案 1 :(得分:0)

在Scala中,您可以使用某些默认类型而无需导入。所有这些类型都位于软件包scala._中。例如ListThrowable

scala.collection.immutable.Stream在此软件包中具有别名:https://github.com/scala/scala/blob/2.13.x/src/library/scala/package.scala#L86

答案 2 :(得分:-1)

您不能“取消导入”导入的值。如果您编写ViewContext,则只会在名称空间中添加另一个导入。


这是另一个例子:

Contextualize

第二行不会删除第一个导入。这两行仅向名称空间添加了一个额外的导入。您现在可以将IHtmlHelper称为import scala.collection.immutable.{Stream => _}import scala.collection.immutable.{Stream => Foo} import scala.collection.immutable.{Stream => Bar}


您为什么不想删除导入内容?如果您不想使用该类,那就不要使用它。无需删除导入。它不会在运行时添加对Stream的依赖或任何其他缺点,导入只是一个编译时概念。

也许您要使用自己的名为Foo的类。因此,不必“删除”默认的Bar导入。只需导入您的课程即可。这将隐藏默认导入。

Stream