Scala:在类型别名不匹配时强制执行编译错误

Die*_*oia 7 settings scala type-alias

在分配共享相同底层类型的不同类型别名时,有没有办法获得编译时错误(或至少是警告)?

换句话说,我说这个代码:

type Address = String
type City = String

def foo(x:Address) = ...
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我想获得编译时错误/警告:

val city: City = "Dublin"
foo(city)
Run Code Online (Sandbox Code Playgroud)

据我所知,编译器允许它,因为它们是相同的底层类型.

Kul*_*mpa 5

据我所知,你不可能获得类型别名的"类型安全".但是,还有一种替代方法可以用于您想要的类型别名:值类.基本上,值类可以为您提供不分配新对象的类型.请注意,对于类型别名没有的值类存在一些限制.

引用scala文档:

正确性

值类的另一个用例是在没有运行时分配开销的情况下获得数据类型的类型安全性.例如,表示距离的数据类型的片段可能如下所示:

  class Meter(val value: Double) extends AnyVal {
    def +(m: Meter): Meter = new Meter(value + m.value)
  }
Run Code Online (Sandbox Code Playgroud)

添加两个距离的代码,例如

  val x = new Meter(3.4)
  val y = new Meter(4.3)
  val z = x + y
Run Code Online (Sandbox Code Playgroud)

实际上不会分配任何Meter实例,但只会在运行时使用原始双精度.