为什么 Kotlin `Any` 是类而不是接口?

时间:2021-02-01 14:23:45

标签: kotlin

Kotlin any 是一个类,带有来自 Java Object 的方法

open class Any() {
    open operator fun equals(other: kotlin.Any?): kotlin.Boolean { /* compiled code */ }
    open fun hashCode(): kotlin.Int { /* compiled code */ }
    open fun toString(): kotlin.String { /* compiled code */ }
}

这是为什么?

我会预测到,由于原语被认为是 Any,但实际上不是 Object,因此最好让 Any 一个他们假装实现的接口而不是他们假装继承的类。

2 个答案:

答案 0 :(得分:2)

如果 Any 是一个接口,但每个类和接口都隐式继承自它,那么它必须具有 <?xml version="1.0" encoding="UTF-8"?><schema xmlns:x="http://example.com/myschema.xsd" elementFormDefault="qualified" targetNamespace="http://example.com/myschema.xsd" xmlns="http://www.w3.org/2001/XMLSchema"><element name="JsonToXSDSchema" type="x:JsonToXSDSchema"/><complexType name="JsonToXSDSchema"><sequence><element minOccurs="0" name="from" type="x:timestampDef"/><element minOccurs="0" name="to" type="x:timestampDef"/></sequence></complexType><simpleType name="timestampDef"><restriction base="string"/></simpleType></schema> equals 的默认实现,这对于界面。

另外,由于每个接口都会继承Any,所以当一个类继承多个接口时会产生冲突。将使用 hashcodeequals 的哪个超类型实现?接口的多重继承是一种非常常见的情况,因此您将非常频繁地处理接口函数签名冲突的复杂性,而不是一次次。

答案 1 :(得分:0)

Object 在 Kotlin 中不存在。那是Java的概念。编译后的字节码与 Object 等 Java 类型兼容这一事实与 Kotlin 语言的角度无关。

Nat Pryce 写了一篇非常简短、非常易读的文章,解释了 Kotlin 类型系统。

http://www.natpryce.com/articles/000818.html

你会注意到他说:

<块引用>

Any 相当于 Java 的 Object 类。

但它们不是一回事。 Java 和 Kotlin 类型系统是完全不同的。

Any 不是接口,因为它的用途与 Java 的 Object 几乎相同。在 Kotlin 中,Any? 是包括所有可以在类型系统中表示的类型的类型。而 Any 是包含除 null 值之外的所有类型的类型。真的,Any? 是 Kotlin 的 Object。出于与 Object 是类型相同的原因,它是一种类型。

正如其他人提到的,Kotlin 在其类型系统中没有原语,因此它们不需要继承或假装继承任何接口。它们不存在。