2016-05-02 4 views
1

Я не могу понять, почему приведенный ниже код дает ошибку несоответствия типа - Здесь я использую generics, а в строке 11 он дает ошибку несоответствия типа. Разве это не должно интерпретировать Т как Int.Почему я получаю ошибку типа-несоответствия, здесь?

object FunctionParamGeneric { 
    def main(args: Array[String]) : Unit= { 
    exec[Int](Fun[Int]) 
    } 

    def exec[T](f:() => T) : T = { 
    println("Inside exec") 
    f() 
    } 

    def Fun[T]() : T = { 
    println("Inside Fun with key ") 
    123 
    } 
} 

Однако, если я

object FunctionParamGeneric { 
    def main (args: Array[String]) : Unit= { 
    exec[Int](() => 1) 
    } 

    def exec[T](f:() => T) : T = { 
    println("Inside exec") 
    f() 
    } 

} 

Он отлично работает. Поскольку f вызывается с номером Int во втором фрагменте, я бы ожидал, что то же самое произойдет в первом фрагменте кода, но это не тот случай. Почему нет?

+0

Если вы хотите вернуть '123', почему вы хотите объявить тип возврата как' T'? –

+0

Пожалуйста, удалите эти номера строк из фрагментов кода ... – Jubobs

ответ

3

Первый фрагмент:

Вы получаете сообщение об ошибке, потому что вы указали общий тип возвращаемого значения для Fun в то время как вы возвращаете Int.

Предположим, если это выражение было разрешено, теперь рассмотрим эти два утверждения:

Fun[Int]() // would have returned 123 

Fun[String]() // what would be output? 

Первое заявление вернулся бы 123 без каких-либо проблем, но что было бы выход во втором случае?

Вот почему такие выражения не допускаются.

Второй фрагмент:

Во втором фрагменте он работает, потому что, когда вы используете exec[Int](() => 1), вы передаете буквальную функцию в качестве аргумента в то время как в первом фрагменте вы даете определение из Fun.


Чтобы объяснить его дальше, если вы посмотрите на определение exec:

def exec[T](f:() => T) : T 

Он принимает Function0 функцию (которая может возвращать любой тип) в качестве параметра. Поэтому, когда вы звоните exec[Int](() => 1), вы передаете функцию () => 1, которая возвращает Int (Примечание, что это не общая функция). Следовательно, это работает.

В первом фрагменте вы определяли общую функцию Fun с общим типом возврата. Но из тела функции вы возвращали значение Int.

+0

Тогда как мы можем вызывать функцию без анонимной функции? – user1147070

+0

Спасибо. Это очистило мое сомнение – user1147070

1

Ваша проблема заключается здесь:

def Fun[T]() : T = { 
    println("Inside Fun with key ") 
    123 
} 

Вы неявно возвращения 123. Который не относится к типу T, но типа Int. Таким образом, компилятор генерирует ошибку.

Если вы хотите, чтобы Fun всегда возвращал Int, вы можете сделать это, определив его как Fun(): Int = ....

Тогда вы должны быть в состоянии назвать

exec[Int](Fun) 
Смежные вопросы