scala早期初始化器与var导致ClassCastException

时间:2017-06-09 01:24:44

标签: scala

我尝试了以下代码:

$(document).ready(function(){
      setInterval(function() {
        $('#result').text(collision_(workerTasks()));
            console.log(tasks);
      }, 200);
    });

    function workerTasks() {
      var tasks = '';
      $('#worker1 [id^=task]').each(function(i){
        var comma = $('#worker1 [id^=task]').length == i ? '' : ',';
        tasks += $('#' + $(this).attr('id'))  + comma;
      });
      return tasks;
    }

                    function collision_() {
                            if (arguments.length > 1) {
                                    for (var x = 0; x < arguments.length; x++) {
                                            for (var y = 1; y < arguments.length; y++) {
                                                    if (x == y) {
                                                            continue;
                                                    }
                                                    if (collision(arguments[x], arguments[y])) {
                                                            return true;
                                                    }
                                            }
                                    }
                                    return false;
                            }
                    }

                    function collision($div1, $div2) {
                        var x1 = $div1.offset().left;
                        var y1 = $div1.offset().top;
                        var h1 = $div1.outerHeight(true);
                        var w1 = $div1.outerWidth(false);
                        var b1 = y1 + h1;
                        var r1 = x1 + w1;
                        var x2 = $div2.offset().left;
                        var y2 = $div2.offset().top;
                        var h2 = $div2.outerHeight(true);
                        var w2 = $div2.outerWidth(false);
                        var b2 = y2 + h2;
                        var r2 = x2 + w2;

                        if (b1 < y2 || y1 > b2 || r1 < x2 || x1> r2) return false;
                        return true;
                        }

它可以编译(在scala版本2.12.2),但在运行时抛出异常:

class C(val g: Int => Int)
object C {
    object A extends {
        var f: Int => Int = x => x
    } with C(x => f(x) + 1)

    def main(args: Array[String]): Unit = {
        println(A.g(3))
    }
}

为什么会这样?

1 个答案:

答案 0 :(得分:1)

这可能是一个scalac错误(/早期初始化变量和lambda类型引用'类类型的特性的意外干扰),因为使用从2.12开始的函数的方法句柄引起:

  

Scala和Java 8 interop也针对功能代码进行了改进,因为使用lambda语法可以轻松地在两个方向上调用函数。 Scala标准库中的FunctionN类现在是单抽象方法(SAM)类型,并且所有SAM types都被统一处理 - 从类型检查到代码生成。没有为lambda生成类文件;而是使用invokedynamic

编辑:除了将var更改为val之外,我找不到解决此问题的好方法,但我想这在您的用例中是不可能的。