Scala中哪些特性是使用反射内部实现的?

18

众所周知,结构类型是通过反射实现的。还有其他语言构造使用反射吗?


谢谢大家的回答!目前我还不确定该怎么做。在这种情况下只接受一个答案是不公平的,但也不可能接受多个答案。 - Nermin Serifovic
只接受关于匿名对象的那个答案,因为它是唯一一个(除了结构类型之外),在其中反射可能会导致严重的性能问题。(也许只有我这样,但我不能让我的问题没有被接受的答案。) - Ken Bloom
6个回答

15

4
这对于定义隐式转换有影响,因此值得单独指出。简而言之,总是在implicit函数之外定义一个命名类,并定义一个独立的隐式函数将其转换为该类。 - Ken Bloom
这正是我在定义隐式转换以添加类方法时所做的 - 是时候改变了。 - Russell

10

枚举类型使用反射来查找 nameOf 函数在给定 Enumeration 类型时可能的所有值。这是仅在第一次调用特定 Enumeration 类型的 nameOf 时执行一次的操作。(请参见Enumeration.scala 中的 populateNameMap 方法)。


5

结构类型中的方法调用取决于反射:

type T = { def startsWith(x:String):Boolean }
def doSomethingWith(x:T) = x.startsWith("abc")
doSomethingWith("abcdef")

2
OP特别提到了结构类型并要求给出其他例子。 - Tom Crockett
@pelotom:注意OP也是Ken Bloom。 - IttayD
@IttayD:什么?原帖是@Nermin Serifovic。 - Tom Crockett
哇,10分钟前 SO 还告诉我 OP 也是 Ken Bloom! - Adam Rabung
2
是的,我可能因为陈述显而易见的事实而受到了负评。抛开这个不谈,你们所有人都应该知道,在首页的问题列表上,StackOverflow并没有告诉你原始发布者,而是告诉你最后回答(或甚至评论)该问题的人。如果你向上滚动并查看问题,它会告诉你原始发布者是谁(在右侧),最后的编辑/标记者是谁(在中心)。 - Ken Bloom

5
如果你认为isInstanceOf/asInstanceOf是反射,那么模式匹配就依赖于它们。

1
那不是反射,那是类型检查和转换,而且非常快。 - vadipp
@vadipp - 是的,看起来每当我们有兴趣这样做时,我们都不应该害怕使用它:https://dev59.com/m3VD5IYBdhLWcg3wDXJ3 - bbarker

2
Scala解释器非常频繁地使用反射。

1

这不是一种语言结构,但 ScalaTest 包含 Suite.execute,它使用反射查找和调用测试方法。

Scala 的模式匹配在幕后使用反射吗?


据我所知,模式匹配仅使用类型检查、类型转换和unapply方法。对于标准库类,编译器还可以生成本机JVM开关、if-else结构等。这里不需要反射。 - vadipp
类型检查(Type Checking)是什么意思? - matanster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接