Java 声称是面向对象和类型安全的,Scala 更是如此。
内部类字段由名为 Field 的类表示,您可以通过反射 API 获取对它的引用。
我的问题:这些语言是否提供了以类型安全方式获取字段引用的方法? (如果不是,为什么不呢?似乎是一个明显的缺陷)
将对象映射到某些外部表示(例如模板中的 html 字段或数据库中的列名称)以自动保持引用名称同步时,这将非常有用。
理想情况下,我想这样说:
&(SomeClass.someField).name()
获取字段声明的名称,类似于 java 枚举让你说的方式:
MyEnum.SOME_INSTANCE.name()
[更新:] 在阅读了有关此功能会以某种方式违反反射 API 意图的反馈后,我同意反射是为编译时未知的事物而设计的,这就是为什么必须如此荒谬的原因用它来学习编译时已知的东西,即它正在编译的类的字段!
编译器为枚举提供了这个,所以如果编译器能够访问枚举字段的引用以允许 MyEnum.SOME_INSTANCE.name(),那么没有理由不应该提供同样的功能到普通类。
是否有任何技术原因导致普通类(class)无法使用此功能?我不明白为什么不,我不同意这个功能会使事情“复杂化”……相反,它会大大简化目前繁琐的反射 API 技术。为什么要强制开发人员使用反射来找出编译时已知的东西?
[更新 #2] 至于这个功能的实用性,您是否尝试过使用 JPA 或 Hibernate 中的 Criteria API 来动态构造查询?您是否看到人们想出荒谬的变通办法来避免必须传入字段的不安全字符串表示以进行查询?
[更新 #3] 最后,一种名为 Ceylon 的新 JVM 语言响应了号召并做出了 trivial做!
最佳答案
My question: do these languages provide any way to obtain that Field reference in a typesafe way?
编译时类型安全?不是我所知道的,至少在 Java 中是这样。 Java 中反射的正常目的是让代码能够处理它事先不了解的类型——(以我的经验)很少处于你想要的位置能够引用已知类型的字段。它确实发生了,但不是很常见。
(And if not, why on earth not? Seems like a glaring deficiency)
每个功能都需要设计、实现、测试,并且必须在提供比语言增加的复杂性更多的值(value)之间取得平衡。
就我个人而言,我可以想到我更愿意在 Java 中看到的功能而不是这个。
关于Java/Scala 以类型安全的方式获取 Field 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9855739/