递归值xxx需要在Scala中输入

时间:2015-08-26 12:47:27

标签: scala type-inference

我很担心为什么Scala会抱怨这段代码。我有两个相互依赖的课程。当我尝试在没有类型声明的情况下创建$(fragment).find('.product').click(function () { $(this).toggleClass("expand"); }); 的新实例时,代码将无法编译。

A

当我声明为 class A( b:B ) { } class B( a:A ){ } val y = new A ( new B( y ) ); // gives recursive value y needs type val z:A = new A ( new B( y ) ); // ok 时,为什么编译器不知道y的类型 ?

2 个答案:

答案 0 :(得分:13)

要推断y的类型,编译器必须首先确定赋值右侧的值类型。在评估右手的类型时,它遇到变量y的引用,这是(此时)仍然是未知类型。因此,编译器检测到y的类型y依赖于new A(new B(y))"的类型。并失败。

在第二个示例中,这种情况不会发生,因为在评估y的类型时,它已经知道y的类型并且成功。

编辑:当递归使用的变量val y : A with Mixin = new A(new B(y)) with Mixin 的类型需要包含混合特征时,可以这样声明:

Long humidity=null; // long humidity=0;
if(uj.get("humidity")!=null){
  humidity=Long.valueOf(uj.get("humidity"))
}

答案 1 :(得分:3)

您可以专门指定 val y : A = new A(new B(y)) 的类型,它将编译:

 public Button buttons[] = null;