Java 声称是面向对象和类型安全的,Scala 更是如此。
内部类字段由名为 Field 的类表示,您可以通过反射 API 获取对其的引用。
我的问题:这些语言是否提供了以类型安全的方式获取该字段引用的任何方法?(如果不是,为什么不呢?似乎是一个明显的缺陷)
在将 Object 映射到某些外部表示时,例如映射到模板中的 html 字段或数据库中的列名,以使引用名称自动保持同步,这将非常有用。
理想情况下,我想说的是:
&(SomeClass.someField).name()
获取字段声明的名称,类似于 java 枚举让你说的方式:
MyEnum.SOME_INSTANCE.name()
[更新:] 在阅读了有关此功能会以某种方式违反反射 API 意图的反馈后,我同意反射是为编译时未知的事物而设计的,这正是为什么必须使用它来实现学习编译时已知的东西,即它正在编译的类的字段!
编译器为枚举提供了此功能,因此如果编译器能够访问枚举字段的引用以允许 MyEnum.SOME_INSTANCE.name(),那么它不应该也能够为普通类提供相同的功能没有逻辑上的理由.
是否有任何技术原因导致普通课程无法提供此功能?我不明白为什么不这样做,我不同意这个功能会使事情“复杂化”……相反,它会大大简化目前繁琐的反射 API 技术。为什么要强迫开发人员使用反射来找出编译时已知的东西?
[更新#2] 至于这个功能的实用性,你有没有尝试过在 JPA 或 Hibernate 中使用 Criteria API 来动态构造查询?您是否看到人们想出一些荒谬的变通办法来避免必须传入要查询的字段的不安全字符串表示形式?
[更新 #3] 最后,一种名为 Ceylon 的新 JVM 语言已经注意到了这一呼吁,并让这件事变得轻而易举!