scala - 无法从导入中隐藏 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, ?)
同样,这仍然是可见的。
解决方案
-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
但别名的范围仅限于这些子包,而不是任何编译单元。
推荐阅读
- memory - 创建在 Smarthpone 上运行的 Android Bot 的要求(不是模拟器)
- sql-server - 在 dbo 架构 Microsoft SQL Server 下创建的 liquibase 日志表
- c# - 如何在使用 iTextsharp c# 导出到 pdf 表时定位 datagridview 中的特定列
- openssl - Openssl 生成 pkcs8 密钥
- django - 如何将一个视图发布的数据用于 django rest 中的另一个视图
- excel-formula - Excel - 在两个日期之间计算每个月的工作天数
- c# - ViewModel 的列表在控制器中为空
- opengl-es-2.0 - OpenGL ES 2.0 过渡动画
- javascript - 不能使用多个标记,一旦我点击了一个
- php - 如何使用 Oauth2.0 Restful API 将 Codeignator- 4.1.3 部署到 cPanel 服务器中?