我很担心为什么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
的类型
?
答案 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;