编写此代码
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, ?)
同样,这仍然可见。
答案 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._
中。例如List
,Throwable
等
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