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
一个他们假装实现的接口而不是他们假装继承的类。
答案 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,所以当一个类继承多个接口时会产生冲突。将使用 hashcode
和 equals
的哪个超类型实现?接口的多重继承是一种非常常见的情况,因此您将非常频繁地处理接口函数签名冲突的复杂性,而不是一次次。
答案 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 在其类型系统中没有原语,因此它们不需要继承或假装继承任何接口。它们不存在。