【问题标题】:Why getting class in Kotlin using double-colon (::)?为什么使用双冒号 (::) 在 Kotlin 中上课?
【发布时间】:2018-01-02 11:44:41
【问题描述】:

我们知道双冒号 (::) 用于在 Kotlin 中获取函数(可调用)引用,例如String::compareTo"string"::compareTo

在 Java 中,我们使用 SomeClass.classsomeInstance.getClass() 来获取类。为什么在 Kotlin 中我们使用 SomeClass::classsomeInstance::classclass 不是函数/方法?

println(String::compareTo)
// output: fun kotlin.String.compareTo(kotlin.String): kotlin.Int
println("string".compareTo("strong"))
// output: -6
println(String::class)
// output: class kotlin.String
println("string".class)
// compile error

【问题讨论】:

  • 双冒号用于 kotlin 中的 reflect(class, method, field),而不是 java 中的方法引用。
  • 谢谢,这是我对documentation 的误解。我认为它是可调用的参考,因为 val f: () -> CharArray = ""::toCharArray 是有效的。
  • @Miha_x64 的答案就是答案,谢谢;正如我问“为什么”而不是“如何”

标签: java operators kotlin


【解决方案1】:

在 Kotlin 中,您可以写 Object::class,这将给您一个 KClass。 KClass 不等同于我们从 Java 中知道的类 Class。 如果您想获得 Java Class 类,您可以编写 Object::class.java - 即: println("string"::class.java)

同样在 java 中,.class 不是方法或成员——它是编译器访问类的特殊指令。 我猜每种语言都会选择最适合它的语法,而 kotlin 的创造者决定使用::

【讨论】:

  • 为什么语言没有实现 getKClass() 代替?并相应地 getJavaClass()???!
  • 也许他们不想受到 Java 的影响 :)
  • 这没有回答问题,这是“为什么”
【解决方案2】:

:: 在 Kotlin 中是关于元编程的,包括方法引用、属性引用和类文字。 见discussion about class literals

【讨论】:

  • 链接已损坏。
  • @Daniel,我重新检查过,它有效。也许它加载得太慢(尤其是在移动网络上)或者您的互联网连接受到审查/限制。
猜你喜欢
  • 2019-09-14
  • 2010-12-03
  • 1970-01-01
  • 2011-08-21
  • 2012-12-20
  • 2016-05-16
  • 2011-03-01
  • 1970-01-01
相关资源
最近更新 更多