Scala 3中的精化类型和匿名子类有什么区别?

w3nuxt5m  于 2023-01-20  发布在  Scala
关注(0)|答案(2)|浏览(152)

匿名类定义为

匿名类是Scala编译器通过new表达式生成的一个合成子类,new表达式中的类或trait名称后面跟有大括号。大括号包含匿名子类的主体,可以是空的。但是,如果new后面的名称引用了包含抽象成员的trait或类,则这些成员必须在定义匿名子类主体的大括号中具体化。

优化类型定义为

通过为基类型提供花括号内的多个成员而形成的类型。花括号内的成员细化基类型中存在的类型。例如,“吃草的动物”的类型为Animal { type SuitableFood = Grass }
--这两个定义都取自Martin Odersky等人的书Programming in Scala Fifth Edition

有什么区别?你能用简单的例子来说明吗?

让我们看一下我的代码示例,它编译:

abstract class A:
  type T

// anonymous class
var o1 = new A { type T = String }

// refinement type
var o2: A { type T = String } = null

o1 = o2 // OK
o2 = o1 // OK

在我看来,refinement type 是一种创建新类型的简便方法,而 anonymous class 隐式地做到了这一点。

qacovj5a

qacovj5a1#

正如Dmytro Mitin在1(https://stackoverflow.com/questions/5031640/what-is-the-difference-between-a-class-and-a-type-in-scala-and-java)和2(https://stackoverflow.com/questions/468145/what-is-the-difference-between-type-and-class)中指出的,主要的区别与类和类型的区别相同。

type限制变量在运行时可以引用或表达式可以生成的可能值。Refinement type 仍然是一个类型,可以使用它来代替定义新的class

如果在示例中不使用 refinement type,则必须定义一个新的class

class AString extends A:
  type T = String

类**是对象的蓝图。一旦定义了类,就可以使用关键字new从类蓝图创建对象。

zengzsys

zengzsys2#

类型和类是不同的(实际上是正交的)概念,类型属于类型论,类属于面向对象程序设计,类存在于字节码中,类型大多不存在于字节码中(如果它们没有专门持久化到运行时或者它们与类没有明显的对应关系)。
What is the difference between a class and a type in Scala (and Java)?
What is the difference between Type and Class?
https://typelevel.org/blog/2017/02/13/more-types-than-classes.html
new A { type T = String }

{
  class AImpl extends A {
    type T = String
  }

  new AImpl
}

如果定义匿名类

val o1 = new A { type T = String }

o1的类型例如可以被细化

val o1: A { type T = String } = new A { type T = String }

甚至是结构性的

val o1: A { type T = String; def foo(): Unit } = new A { 
  type T = String
  def foo(): Unit = println("foo")
}

如果我们静态向上抛的话就不精细了

val o1: A = new A { type T = String }

所以定义一个匿名类并不意味着变量的类型是一个精化类型。
另一方面,你可以考虑精炼型

type X = A { type T = String }
val o2: A { type T = String } = null

没有引入匿名类。字节码中唯一的类是A,没有AImpl(直到示例化new ...)。
scala精化类型可以在类型理论(或依赖类型的编程语言)上与refinement types相比较,即(依赖)类型被赋予 predicate 。

相关问题