我一看到这个,就需要查找字节码,因为我无法想象它应该被翻译成什么。虽然我认为“它”是一个错误,但我将向您展示我目前发现的内容。
对于CHECKED,实际上创建了自己的子类,即public final class GWGStatus$CHECKED extends GWGStatus,尽管GWGStatus 本身就是一个枚举。可能又是 JVM 字节码中允许但在 Java 语言规范中不允许的东西。
现在是不太一致的部分。虽然以下在 Java 中有效:
GWGStatus.CHECKED status = (GWGStatus.CHECKED) GWGStatus.CHECKED;
status.auditDate = new Date();
System.out.println(status.auditor());
并按预期打印 Peter,在 Kotlin 中无法进行转换(还没有?):
GWGStatus.CHECKED as GWGStatus.CHECKED // fails: Use of enum entry names as types is not allowed, use enum type instead
现在在 Kotlin 中使用 Java 反射实用程序(例如 status::class.java.declaredFields 或 .java.declaredMethods)auditor() 和 getAuditDate()(等)都是可见且可访问的(正如 Java 代码本身已经证明的那样)。进一步分析,只使用 Kotlin 反射:
GWGStatus.UNCHECKED::class // returns class GWGStatus
GWGStatus.CHECKED::class // return class GWGStatus$CHECKED ... that's good so far
GWGStatus.CHECKED::class.declaredMembers // empty list ... didn't expect this one
// empty too: GWGStatus.CHECKED::class.declaredMemberProperties
// and GWGStatus.CHECKED::class.declaredFunctions
GWGStatus.CHECKED::class.superTypes // shows GWGStatus as expected
GWGStatus.CHECKED::class.members // shows clone(), finalize(), name, equals, hashcode, tostring, getdeclaringclass, ordinal... nothing we are interested in and rather the ~general enum members
GWGStatus::class.nestedClasses // empty too
好的...我们无法使用 Kotlin 反射看到它们(或者我可能没有使用正确的方法?;-))。所以:这里有些东西闻起来像一个错误,但我还不确定这个错误是什么:
- 难道一开始就不应该创建子类吗?
- 子类是否应该在 Kotlin 本身中可访问和可见?
- Kotlin 编译器是否应该抱怨这一点,因为这还没有完成?
- 实际上是错误消息错误,它应该只是允许演员?
- 还有别的吗?