gpt4 book ai didi

scala - 对 Union 类型使用 Any 是个好主意吗?

转载 作者:行者123 更新时间:2023-12-03 14:40:05 27 4
gpt4 key购买 nike

我想创建一个类生成器(用于 Avro 模型)。我有一个问题,因为有时我生成的类的字段可能是许多不同类型之一,假设它可能是 IntString管他呢。简单的想法是创建类型为 Any 的字段。并在运行时检查它是否正常。

问题是使用 Any放弃 scala 类型系统的一些强大功能。代码中的一些错误在编译时不会被捕获(如果我给一个 List 给一个期望 StringIntAny 覆盖的函数)。

例如 :

让我对我的类(class)进行以下描述:

{"className" : "MyClass", "fields" : [
{ "fieldName" : "myField", "type" : ["String", "Int"]}
]}

根据这个描述,我创建了这个类:
class MyClass(myField: Any)

我想创建这样的东西:
class MyClass(myField: String or Int)

我应该停止使用 Any ?正在使用 Any在 Scala 社区中通常被认为是一个好主意?

最佳答案

Is using Any generally considered a good idea in the scala community?



不。 Any意味着没有类型信息,所以它通常被认为是一种不好的做法。

在 Scala 中,您可以使用 Either 来表达联合类型。 ,尽管如果联合中有很多可能的类型,它会变得很麻烦。例子:
class MyClass(myField: Either[String, Int]) {
def doSomething = myField match {
case Left(myStringField) => ???
case Right(myIntField) => ???
}
}

另一种可行的方法是制作 MyClass通用类型:
class MyClass[A](myField: A)

然而,这并没有对 A 的类型设置任何限制。 .

为了放置约束,例如使它成为类型的有限子集,您可以使用临时多态:
trait MyConstraint[A]
class MyClass[A: MyConstraint](myField: A)

现在 new MyClass(myValue)除非有隐含的 MyConstraint[A],否则不会编译在适用范围。现在您可以使用隐式值将您想要允许的类型列入白名单
implicit object IntConstraint extends MyConstraint[Int]
implicit object StringConstraint extends MyConstraint[String]

例子:
new MyClass(42) // ok, there's implicit evidence of MyConstraint[Int]
new MyClass("foo") // ok, there's implicit evidence of MyConstraint[String]
new MyClass(false) // won't compile, no implicit evidence of MyConstraint[Boolean]

在技​​术方面, MyConstraint是一个类型类,用于细化类型 AMyClass 的构造函数中.

您可以通过要求为其每个实例定义一组操作来进一步表征类型类。例如。
trait MyConstraint[A] {
def mandatoryOp: A
}

implicit object IntConstraint extends MyConstraint[Int] {
def mandatoryOp = 42
}

implicit object StringConstraint extends MyConstraint[String] {
def mandatoryOp = "foo"
}

class MyClass[A](myField: A)(implicit ev: MyConstraint[A]) {
def doSomething: A = ev.mandatoryOp
}

请注意 A: MyConstraint只是需要 MyConstraint[A] 类型的隐式参数的语法糖.在上一个示例中,我选择了显式语法以便具有隐式参数 ev范围内可用。

关于scala - 对 Union 类型使用 Any 是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38678418/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com