java - 不使用 2.11 编译的 Java 中 Scala 集合的简单使用

标签 java scala scala-2.11

所以我得到了这个 super 令人兴奋的 Java 类:

import scala.collection.immutable.Stream;

public class EmptyStreamFactory {
  public static Stream<String> createEmptyStringStream() {
    return Stream.<String>empty();
  }
}

使用类路径上的 2.10.4 scala-library.jar 编译得很好(或 2.9.2,这是值得的)。现在我用 2.11 试试:

EmptyStreamFactory.java:5: error: incompatible types
    return Stream.<String>empty();
                               ^
  required: Stream<String>
  found:    GenTraversable
1 error

这有什么意义呢?一目了然,唯一可能相关的区别是 Stream.Empty 在 2.11 中不再扩展 Serializable,但我不明白这是怎么回事问题。 List 等也会发生同样的事情。

有一个简单的解决方法——您可以转换为适当的类型——但我想了解这里发生了什么。

(我使用的是 Oracle 的 JDK,版本 1.7.0_67。)

最佳答案

桥接方法的静态转发器本身并未标记为桥接方法,并且 java 出于某种原因更喜欢返回 GenTraversable 的方法,因为它有两个可供选择。

classOf[scala.collection.immutable.Stream[_]].getMethods filterNot 
  (_.isBridge) filter (_.getName == "empty") foreach println
public static scala.collection.immutable.Stream scala.collection.immutable.Stream.empty()
public static scala.collection.GenTraversable scala.collection.immutable.Stream.empty()

您不能在 java 语言中重载返回类型,因此任何人都可以猜测编译器在遇到它时会做什么。我什至不知道它是否被指定,尽管它可能是。

总的来说你can't call collections methods from java , 这已经被判断为 wontfix。

编辑:关于“仍然不明白 2.11 中发生了什么变化来实现这一点”,这是第一批候选人:

% git log --no-merges --oneline --grep=forwarder v2.10.4..v2.11.2
532ef331eb (pull/3868/head) Restore reporter forwarders in CompilationUnit
b724201383 Rip out reporting indirection from CompilationUnit
98216be3f3 Move reporting logic into Reporting trait
653c404d7f (pull/3493/head) SI-3452 GenBCode version of the static-forwarder signature fix
640e279500 SI-3452 A better fix for static forwarder generic sigs
f8d80ea26a SI-3452 Correct Java generic signatures for mixins, static forwarders
51ec62a8c3 (pull/3480/head) SI-6948 Make the Abstract* classes public.
731ed385de SI-8134 SI-5954 Fix companions in package object under separate comp.
3cc99d7b4a (pull/3103/head) Collections library tidying and deprecation.  Separate parts are listed below.
5d29697365 Flesh out the Delambdafy phase.
6e2cadb8bd (pull/2951/head) SI-7847 Static forwarders for case apply/unapply
9733f56c87 (pull/1173/head) Fixes SI-4996.

您不会通过查看库代码找到它,这是肯定的。这是编译器中的更改。

关于java - 不使用 2.11 编译的 Java 中 Scala 集合的简单使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467488/

相关文章:

scala - Scala 2.11中运行时动态编译scala类文件

java线程和同步

java - Micrometer/Prometheus 如何防止仪表值变为 NaN?

java - Play2 - 模板 -> 递增

scala - Scala.js 中 JS 库的类型化外观

scala - 无法让 uTest 查看我的测试

json - Scala JSON 在 2.11 中已弃用 - Argonaut 和 scala.util.parsing.json 一样简单吗?

scala - 将 try 转换为选项而不丢失 Scala 中的错误信息

java - 语音转文本 api 其他语言 android

Java:如何对在方法范围内创建和操作文件的方法进行单元测试?