当前位置: 首页 > 面试题库 >

Scala的.type和Java的.class文字

羿季
2023-03-14
问题内容

语言设计的角度来看,我想知道为什么Scala删除了Java的类文字(例如String.class)并替换为classOf[String],但是又添加了带有其Singletons
like Singleton.type而不是like之类的“类型文字” typeOf[Singleton]


问题答案:

这是我的合理化:

classOf [T]

classOf定义Predef为具有此签名的函数:

def classOf[T]: Class[T]

尽管它是由编译器实现的,但可以使用函数语法 而不必在 语法 上创建任何特殊处理 。因此,这是考虑此选项的原因之一。

这样的替代方案String.class暗示每个类都有一个带有字段的伴随对象class。因此,存在两个问题:

  1. class 是一个关键字,因此会导致语法需要特殊情况的问题
  2. 如果只创建一个class A 没有 伴随对象的对象,那么引用它会很奇怪,A.class就像访问伴随对象上的 class 字段一样A

一种:

关于为什么typeOf[A]可能会造成混淆。它看起来像一个函数调用,但是类型与函数结果不在同一个世界中(函数结果具有类型,但是类型本身仅在编译时有意义)。我可以将类型归因于变量:

scala> val a: A.type = A
a: A.type = A$@c21a68

我不能分配一个函数返回的类型:

scala> val b = A.type
<console>:1: error: identifier expected but 'type' found.
   val b = A.type
             ^

另一方面,类型可以是对象的成员:

scala> object A { type type1 = Int }
defined module A

scala> val x: A.type1 = 1
x: A.type1 = 1

因此,A.type引用对象的类型并不是一件大事A。请注意,.type仅用于指代单例对象的类型,因此它并不是那么频繁。



 类似资料:
  • 问题内容: 是什么使类型不同于类,反之亦然? (与一般语言无关) 问题答案: 以下答案来自Gof书(“设计模式”) 对象的类定义了对象的实现方式。该类定义了对象的内部状态及其操作的实现。 相反,对象的 类型仅引用其接口-可以响应的一组请求。 一个对象可以具有许多类型,而不同类的对象可以具有相同的类型。 max函数需要一个类型为operation>且具有其自身类型的类型作为其接口之一,满足上述要求的

  • Haskell是一种函数式语言,它是严格类型的,这意味着整个应用程序中使用的数据类型在编译时将为编译器所知。 内置类型类 在Haskell中,每个语句都被视为一个数学表达式,该表达式的类别被称为Type 。 您可以说“Type”是编译时使用的表达式的数据类型。 要了解有关Type更多信息,我们将使用“:t”命令。 通常, Type可以被视为一个值,而Type Class可以被认为是一组类似的类型。

  • 所以我有两个方法,一个在超类中,另一个在子类中,具有相同的名称和参数,比如public void method()。子类中还有另一个方法method1(),如下所示: 上面的代码在执行时按计划进行(方法1使用超类中的方法),但如果我将其更改为这样: 其中class是超类的名称,出于某种原因,它不使用超类方法,而是使用同名子类的方法。超不是和((类)this)一样吗?为什么会发生这种情况? 编辑:这

  • 问题内容: 假设我们有一个类名Home。是什么区别 Home.this 和 Home.class ?他们指的是什么? 问题答案: 这个 引用该类的当前实例。 此表达式的正式术语似乎是qualified this,如Java语言规范的15.8.4节所引用。 在一个简单的类中,说和将等效。此表达式仅在存在内部类且需要引用封闭类的情况下使用。 例如: 家庭类 将类的表示形式作为对象返回。 此表达式的正式

  • 我运行了一个用Java编写的Spark流媒体程序来读取Kafka的数据,但是我遇到了这个错误,我试图找出可能是因为我使用scala或Java的版本太低。我使用了JDK版本15,但仍然出现了这个错误,有人能帮我解决这个错误吗?非常感谢。 这是我运行项目时的终端: 这是项目的文件pom.xml: 这是项目的文件主体:

  • 我被泛型子类型搞糊涂了。 在Java中,如果类型是的子类型,则泛型类型和是不变的。例如,不是的子类型。 但是,在Scala中,如果类型是的子类型,则泛型类型和是协变的。那么Scala中泛型类的属性是什么而Java中没有呢?