我正在经历Kotlin
reference document然后我看到了这一点。
类声明由类名,类头组成 (指定其类型参数,主要构造函数等)和 班体,四周有花括号。标题和正文 是可选的;如果类没有主体,可以省略花括号。
class Empty
现在我想知道没有标题和正文
的这种类声明的用途是什么答案 0 :(得分:5)
空类可以用于表示状态以及其他类,尤其是在密封类的一部分时。例如
sealed class MyState {
class Empty : MyState()
class Loading : MyState()
data class Content(content: String) : MyState()
data class Error(error: Throwable) : MyState()
}
通过这种方式,您可以将它们视为具有更大灵活性的java enum条目。
答案 1 :(得分:3)
从实际的程序员日常角度看,空课程确实没有多大意义。然而,有些情况需要这种行为。
在某些情况下,我们希望确保我们要定义一个类,同时,我们希望确保永远不会创建此类的实例(从此类创建的类型称为{{1 }或empty type
)。
完美的例子是Kotlin uninhabited type
类没有类声明头和body(注意它也有私有构造函数)
https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Nothing.kt
Kotlin语言中Nothing
的用法很少。其中一个是不返回值的函数(不要将此与Nothing
混淆,其中函数返回实际返回类型Unit
的值)。典型示例是用于测试的Unit
方法或退出当前进程的方法。这两种方法都不会实际返回任何值,但我们需要明确地告诉使用特殊类型(assertFail
)的编译器。
Nothing
任何内容都可以用于fun assertFail():Nothing {
throw Exception()
}
可以投射到Function<*, String>
的开始投影
空类的另一种用法是类型标记或占位符:
Function<in Nothing, String>
有些语言使用空类进行元编程,尽管我没有亲自探讨过这部分内容: Advantages of an empty class in C++
答案 2 :(得分:2)
tldr:他们想证明这是可能的
它仍然是Any
类型,因此会自动确定methods。我认为在大多数情况下,这没有意义,但在文档案例中,它用于显示类的最简单的定义。
Java等价物将是:
public final class Empty {
}
答案 3 :(得分:1)
作为最终结果,它没有多大意义。然而,它在积极开发和设计时可以用作某种占位符,可以在将来扩展。这种简洁的语法允许您根据需要快速定义这些新类型。类似的东西:
%
我认为在文档中特别提到的主要原因是为了证明,语言语法通常可以简洁,而不是专门为常见用法创建。
答案 4 :(得分:1)
Spring Boot框架中的空类用法示例:
@SpringBootApplication
class FooApplication
fun main(args: Array<String>) {
runApplication<FooApplication>(*args)
}
答案 5 :(得分:0)
密封类在某种意义上是枚举类的扩展:枚举类型的值集也受到限制,但是每个枚举常量仅作为单个实例存在,而密封类的子类可以具有多个实例可以包含状态。 reference