2015-01-19 3 views
39

В Java 8 мы можем ссылаться на метод экземпляра класса. Вот примерСсылка на метод конкретного экземпляра в Kotlin

Function1<Integer, Object> ref = a::getItem; 

а является экземпляром класса Adapter, который имеет метод Object getItem(int i).

Можем ли мы сделать то же самое в Котлине? Я пробовал такой же синтаксис без успеха. До сих пор я только был в состоянии создать ссылку на метод расширения, как так:

val ref: Adapter.(Int) -> Any = Adapter::getItem 

Но здесь я все еще нужен экземпляр Adapter, чтобы вызвать его. Другой alterantive я вижу, является определение лямбда, как это:

val ref: (Int) -> Any = { a.getItem(it) } 
+11

Захват ссылок еще не поддерживается, но будет поддерживаться в будущем –

+0

Возможный дубликат [Kotlin: как передать функцию как параметр другому?] (Http://stackoverflow.com/questions/16120697/kotlin- как-к-pass-a-function-as-parameter-to-another) – Ram

+0

Ваш вариант с использованием лямбда - это лучший в настоящее время метод, равный 1.0, хотя в будущем он будет изменяться, поскольку @AndreyBreslav упоминает –

ответ

20

С Котлин 1.1, вы можете использовать bound callable references сделать:

val f = a::getItem 

list.forEach(myObject::myMethod) 

Ранее Котлин версии Дон» t имеет эту функцию и требует, чтобы вы делали лямбду каждый раз, за ​​исключением these simple cases.

+1

Спасибо за ссылку на предложение. Для функции объекта Companion работает только этот синтаксис [с Kotlin 1.3]: '(ClassA) :: function' или' ClassA.Companion :: function'. Первый можно использовать только в Kotlin, поэтому для согласованности между Java и кодом Kotlin лучше использовать второй синтаксис, если вам нужно также ссылаться на него на Java. – Metallica