首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala:枚举为什么不是类型安全的?

Scala:枚举为什么不是类型安全的?
EN

Stack Overflow用户
提问于 2012-10-30 04:45:20
回答 1查看 1.5K关注 0票数 23

我见过许多关于Scala枚举不是类型安全的断言。它怎么不是类型安全的呢?显而易见,它似乎是类型安全的,因为您不能将一个枚举的值传递给另一个枚举。

枚举有哪些陷阱或需要避免的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-30 05:27:00

是半安全的。它是类型安全的,这是编译器虚构的,所以很容易被破坏。例如,

代码语言:javascript
复制
trait Parent
class Boy extends Parent { override def toString = "boy" }
class Girl extends Parent { override def toString = "girl" }
def f(g: Girl) = g.toString

scala> f((new Boy).asInstanceOf[Girl])
java.lang.ClassCastException: Boy cannot be cast to Girl
    at .<init>(<console>:15)
    ...

好吧,男孩不是女孩。

现在,让我们尝试使用枚举:

代码语言:javascript
复制
object Test extends Enumeration { val One, Two = Value }
object Probar extends Enumeration { val Uno, Dos = Value }
def h(tv: Test.Value) = tv.toString

scala> h((Probar.Uno).asInstanceOf[Test.Value])
res0: java.lang.String = Uno

等等,什么?

这种虚构导致了其他奇怪的行为:

代码语言:javascript
复制
def h(pv: Probar.Value) = pv.toString  // Add this to the other h in a :paste

method h:(pv: Probar.Value)java.lang.String and
method h:(tv: Test.Value)java.lang.String at line 9
have same type after erasure: (pv: Enumeration#Value)java.lang.String
           def h(pv: Probar.Value) = pv.toString

呃,好的,谢谢?

而且,由于编译器并不真正将Enumeration理解为它自己的构造,所以它不能以您期望的方式帮助您:

代码语言:javascript
复制
scala> def oops(tv: Test.Value) = tv match { case Test.One => "okay" }
oops: (tv: Test.Value)java.lang.String
// No incomplete match warning?  Okay....

scala> oops(Test.Two)
scala.MatchError: Two (of class scala.Enumeration$Val)
    at .oops(<console>:8)
    ...

因此,如果您完全按照预期以相对有限的方式使用它,则它提供了类型安全。但它没有其他模式的功能和健壮性,比如下面的模式:

代码语言:javascript
复制
// In REPL, :paste the next three lines
sealed trait Foo
object Bar extends Foo
object Baz extends Foo

scala> def safe(f: Foo) = f match { case Bar => "okay" }
<console>:9: warning: match is not exhaustive!
missing combination            Baz

        def safe(f: Foo) = f match { case Bar => "okay" }
                           ^

谢谢你,编译器!

票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13129358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档