gpt4 book ai didi

java - Scala 编译器不使用 case 类的 unapply 方法进行模式匹配,这是为什么呢?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:44 25 4
gpt4 key购买 nike

abstract class Animal

case class Cat(name: String) extends Animal

case class Dog(name: String) extends Animal

假设我已经定义了 Cat 和 Dog,这两个案例类。

然后我像这样使用它们:

val animal = createAnimal
animal match {
case Dog(anyName) => "this is a dog"
case Cat("kitty") => "this is a cat named kitty"
case _ => "other animal"
}

如果我将字节码反编译成 Java,我会得到这样的结果:

Animal animal = createAnimal();
String result = "other animal";

if (animal instanceof Dog) {
result = "this is a dog";
} else if (animal instanceof Cat) {
Cat cat = (Cat) animal;
if (cat.name() == "kitty") {
result = "this is a cat named kitty";
}
}

return result;

编译器为 Cat 和 Dog 生成了 unapply 方法,但它们没有在模式匹配代码中使用。

这是为什么?

最佳答案

从 Scala 语言的角度来看这个问题,实现工作符合规范要求。参见 http://www.scala-lang.org/docu/files/ScalaReference.pdf

在 §5.3.2 中,案例类被定义为在伴随(提取器)对象中包含 unapply 的实现。

但是,当我们谈到模式匹配(§8.1)时,案例类有自己的匹配部分,§8.1.6,它根据构造函数的参数指定它们在模式匹配中的行为,而不引用已经生成的 unapply/unapplySeq:

8.1.6 Constructor Patterns

Syntax:

SimplePattern ::= StableId ‘(’ [Patterns] ‘)

A constructor pattern is of the form c(p1,…,pn) where n≥0. It consists of a stable identifier c, followed by element patterns p1,…,pn. The constructor c is a simple or qualified name which denotes a case class. If the case class is monomorphic, then it must conform to the expected type of the pattern, and the formal parameter types of x's primary constructor are taken as the expected types of the element patterns p1,…,pn. If the case class is polymorphic, then its type parameters are instantiated so that the instantiation of c conforms to the expected type of the pattern. The instantiated formal parameter types of c's primary constructor are then taken as the expected types of the component patterns p1,…,pn. The pattern matches all objects created from constructor invocations c(v1,…,vn) where each element pattern pi matches the corresponding value vi.

文档在§8.1.8中继续描述unapply/unapplySeq的使用;但这是规范的一个单独的、不相交的部分,它适用于不是案例类的类。

因此,您可以将 unapply 视为一种在您自己的代码中使用的有用方法,但不是 scala 语言中模式匹配所必需的方法。

关于java - Scala 编译器不使用 case 类的 unapply 方法进行模式匹配,这是为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24227037/

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