2015-02-14 3 views
4

Scala новичок здесь. Я очень смущен тем, почему приведенный ниже код генерирует исключение. Я знаю, Function1[Int, Int] имеет аннотация apply метод типа Int => Int, который необходимо определить. Не делает ли это ниже oddfunc? Почему не x(3) назвать конкретный метод apply, определенный в oddfunc?Как вы создаете реализацию абстрактного признака Function1

Welcome to Scala version 2.11.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> trait oddfunc extends Function1[Int,Int] { 
| def apply(a: Int): Int = a+3 
| } 
defined trait oddfunc 

scala> val x = new oddfunc{} 
x: oddfunc = <function1> 

scala> x(3) 
java.lang.AbstractMethodError: $anon$1.apply$mcII$sp(I)I 
    at oddfunc$class.apply(<console>:8) 
    at $anon$1.apply(<console>:8) 
    ... 43 elided 
+1

Это очень странно. При визуальном осмотре ваш код кажется прекрасным. Я вырезал и вставлял ваш точный код в свой REPL, и он работал отлично, как и ожидалось. – acjay

+0

Возможно, это вещь для окружающей среды. На какой версии Scala вы работаете? Ява? – ntilwalli

+1

2.11.0 и 1.7.0_25. Но ваш пример достаточно обычный, чтобы он действительно работал в любом месте. – acjay

ответ

2

Это похоже на ошибку, которая была введена в компилятор Scala между 2.11.4 и 2.11.5. Я понизился до Scala 2.11.4, чтобы убедиться, что это исправлено.

Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> trait oddfunc extends Function1[Int,Int] { 
    | def apply(a: Int): Int = a+3 
    | } 
defined trait oddfunc 

scala> val x=new oddfunc{} 
x: oddfunc = <function1> 

scala> x(3) 
res0: Int = 6 
Смежные вопросы