Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单使用Java中的Scala集合,不使用2.11编译_Java_Scala_Scala 2.11 - Fatal编程技术网

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

简单使用Java中的Scala集合,不使用2.11编译,java,scala,scala-2.11,Java,Scala,Scala 2.11,我有一个非常令人兴奋的Java类: import scala.collection.immutable.Stream; public class EmptyStreamFactory { public static Stream<String> createEmptyStringStream() { return Stream.<String>empty(); } } 这有什么意义呢?乍一看,唯一与远程相关的区别是,Stream.Empty不再扩展2.

我有一个非常令人兴奋的Java类:

import scala.collection.immutable.Stream;

public class EmptyStreamFactory {
  public static Stream<String> createEmptyStringStream() {
    return Stream.<String>empty();
  }
}
这有什么意义呢?乍一看,唯一与远程相关的区别是,
Stream.Empty
不再扩展2.11中的
Serializable
,但我不认为这会导致此问题。在
列表
等中也会发生同样的情况

有一个简单的解决方法,你可以直接转换到合适的类型,但我想了解这里发生了什么


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

我今天学到的是,Java很乐意忽略一个无关的类型arg(JLS 15.12.2.1,本节末尾的小字)

这条规则源于兼容性问题和原则 可替代性

显然,一些规则源于原则推理,另一些源于实际问题,偶尔的规则具有双亲关系

apm@mara:~/tmp$ javap -classpath ~/scala-2.11.2/lib/scala-library.jar scala.collection.immutable.Stream | grep empty
  public static <A extends java/lang/Object> scala.collection.immutable.Stream<A> empty();
  public static scala.collection.GenTraversable empty();
apm@mara:~/tmp$ javap -classpath ~/scala-2.10.4/lib/scala-library.jar scala.collection.immutable.Stream | grep empty
  public static <A extends java/lang/Object> scala.collection.immutable.Stream<A> empty();
  public static <A extends java/lang/Object> scala.collection.immutable.Stream<A> empty();
apm@mara:~/tmp$javap-classpath~/scala-2.11.2/lib/scala-library.jar scala.collection.immutable.Stream | grep empty
公共静态scala.collection.immutable.Stream empty();
公共静态scala.collection.GenTraversable empty();
apm@mara:~/tmp$javap-classpath~/scala-2.10.4/lib/scala-library.jar scala.collection.immutable.Stream | grep empty
公共静态scala.collection.immutable.Stream empty();
公共静态scala.collection.immutable.Stream empty();
看起来转发器到桥接器的方法是固定的

这包括:

import scala.collection.immutable.Stream;
import scala.collection.immutable.Stream$;

public class EmptyStreamFactory {
    public static Stream<String> createEmptyStringStream() {
        return Stream$.MODULE$.<String>empty();
    }
}
导入scala.collection.immutable.Stream;
导入scala.collection.immutable.Stream$;
公共类空流工厂{
公共静态流createEmptyStringStream(){
返回流$.MODULE$.empty();
}
}
我需要一个三天的周末来重读Java中关于重载的规范


可能是因为流是抽象的,大多数特定返回类型规则的规则起作用。

桥接方法的静态转发器本身没有标记为桥接方法,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语言中,不能重载返回类型,因此任何人都可以猜测编译器在遇到它时会做什么。我不知道它是否被指定,尽管它可能是

一般来说,你和这已经被判断为wontfix

编辑:re“仍然不明白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.

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

Stream.Empty
仍然扩展了
Serializable
,因为它扩展了
Stream
Empty
上删除的
Serializable
是多余的,因此这不可能是您问题的根源。谢谢您提供额外的线索,但我仍然不明白发生了什么。@TravisBrown第二个签名来自但不是生成GenTraversable的上限。现在是了,Java重载选择了它。出于某种原因,它在流上选择它,但在流上选择它$。在流$上,GenTraversable返回方法是桥接方法。在流中,它不是。@extempore谢谢,我昨晚注意到了,但它没有注册。这就像大脑必须运行退出擦除(thunk)以另一种模式进行操作。你不是在说Scala吗?从链接:
我一直玩到它变得太乏味。
哈哈,看起来马丁和我在某些方面达成了一致,只要“it”是一个类型参数。谢谢。仍然不明白是什么改变了2.11,使这发生了,但哦,好吧。你能建议一个具体的解决方法吗?对不起,我唯一的建议是“不要期望它会起作用”。实际上,从昨晚开始,IIRC对两个抽象成员进行相同擦除的最后尝试是采用最具体的返回类型。好了,15.12.2.5节到此结束。
% 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.