Java clojure中的Scala类

Java clojure中的Scala类,java,scala,clojure,jvm,Java,Scala,Clojure,Jvm,这只是我今天早上遇到的一个愚蠢的问题:我们可以使用clojure的Scala类吗 因为如果答案是肯定的,我肯定会学习Clojure ^ ^Scala类是Java类,您可以非常方便地使用Clojure中的Java类 享受学习Clojure的乐趣。:-) Scala类,是的。Scala singleton对象,具有与Java相同的年份签名。Scala特质,不,Scala含蓄,哈,你开玩笑 因此,体验的范围可能从“ok”(如果只是您的类)到非常不愉快(例如Scala集合)。值得一提的是,Scala类采

这只是我今天早上遇到的一个愚蠢的问题:我们可以使用clojure的Scala类吗


因为如果答案是肯定的,我肯定会学习Clojure ^ ^

Scala类是Java类,您可以非常方便地使用Clojure中的Java类


享受学习Clojure的乐趣。:-)

Scala类,是的。Scala singleton对象,具有与Java相同的年份签名。Scala特质,不,Scala含蓄,哈,你开玩笑


因此,体验的范围可能从“ok”(如果只是您的类)到非常不愉快(例如Scala集合)。

值得一提的是,Scala类采用函数参数,例如:

Option.map(f : A => B)

不太可能从Clojure中非常有用,因为Clojure编译器不会将Clojure lambdas转换为
scala.function的实例。我和Daniel在一起-我认为interop会很差

也可以从Scala中使用Cloujre类(使用
gen class
deftype/defrecord
创建)。下面都是字节码。不幸的是,是的。像
blank?
变成
blank\u QMARK
。这是因为Java(或JVM?)不支持标识符中的此类字符。使用
gen class
或,比如说,
definterface
+
deftype
(或
defrecord
),您可以随意调用您的方法。请注意,Clojure本身仅使用类作为实现细节(在低级别,用户不一定需要知道),在互操作场景中(在高级别)。纯Clojure代码是围绕与Java代码完全不同的概念构建的;如果你想混合使用Clojure和基于Java/Scala类的代码,你可能会通过在Clojure中实现坚实的功能块,然后公开包装类(这相当简单)。@abhin4v:当然,但是如果你真的想从Java调用Clojure函数,您可以执行类似于
clojure.lang.RT.var(“clojure.core”、“偶数?”)的操作。调用(2)
,避免讨厌的咀嚼。(这相当于
(#'clojure.core/even?2)
;或者,您可以使用
.get
.invoke
从Var中提取函数。)@oxbow_lakes:例如,如果Scala有一个很好的7zip压缩实现,我可能会从clojure中调用它,以避免编写自己的版本。或者,对于我感兴趣的某种输入,如果它有一个很棒的解析器,那么编写一个转换器将该解析器返回的Scala数据结构转换为Clojure数据结构可能比重新实现整个解析器更容易(我已经做了类似于ANTLR的事情)。事实上,这就是我理解问题的意思(请注意,这是关于“使用Clojure中的Scala类”而不是“在Clojure中编写Scala代码”)。为什么使用Scala-2.8标记?这个版本有什么特别的东西吗?我不知道隐式,但trait是接口,可能与helper类耦合在一起。Daniel Spiewak对Scala/Java互操作进行了介绍,包括使用Java特性的部分;从这一点来看,对于那些不是“纯粹抽象”的特性来说,这会变得单调乏味,但在Clojure中,大部分单调乏味的事情——也许几乎所有的事情——都可以用宏来抽象。我很确定你可以用宏来解决可用性问题——基本上让宏将Clojure lambda包装成scala.function?