2016-03-15 23 views
11

Na przykład mam klasy Java (od zewnętrznej biblioteki):Czy jest możliwe dodanie "statycznej" funkcji rozszerzenia dla klasy Java?

class A {} // This is Java class 

chcę dodać funkcje rozszerzeń napisanych na Kotlin i nazwać jak:

A.foo() // This is call of extension function `foo` from Kotlin code 

Jak rozumiem, teraz jest niemożliwe do wykonania w Kotlin, ponieważ obsługuje on "statyczne" funkcje rozszerzenia tylko dla KClass-es with companion object. Dobrze?

Wydaje się, że nic nie stoi na przeszkodzie, aby wdrożyć taką funkcjonalność w Klininie później. Dobrze?

+0

Dlaczego tego potrzebujesz? Możesz po prostu zdefiniować zwykłą funkcję w pakiecie, aby uzyskać ten sam efekt, z tą różnicą, że nie musisz używać nazwy klasy ze składnią kropkową, aby ją wywołać. Jeśli spodziewasz się użyć refleksji, aby znaleźć metodę statyczną w jakiejś klasie, to jest inna historia ... –

+0

Po prostu chcę użyć składni 'A.foo()' zamiast 'foo (A)' ponieważ Kotlin promuje takie składnia dla rozszerzenia funkcjonalności klas (patrz pierwszy akapit [tutaj] (https://kotlinlang.org/docs/reference/extensions.html#extensions)). –

+2

Po prawej, funkcje rozszerzeń i właściwości dotyczą * wystąpień * klas. Nie masz tutaj instancji, tylko wywołanie funkcji. –

Odpowiedz

22

Masz rację. W Kotlin 1.0 można zdefiniować funkcje rozszerzenia na obiekcie towarzyszącym klasy Kotlin, a takie funkcje można wywoływać przy użyciu składni A.foo(). Wsparcie dla definiowania statycznych funkcji rozszerzeń na klasach Java jest możliwą funkcją dla przyszłych wersji Kotlin, ale nie jest to obecnie na mapie drogowej Kotlin 1.1.

+1

Cześć yole, jakieś wieści o tym? – elect

+0

@elect To wciąż nie jest na mapie drogowej dla wersji 1.1 lub 1.2. – yole

+1

To powinno być! Używamy go w Swift przez cały czas i może być użyteczny w wielu scenariuszach (np. Date.fromJSON (...)). – Marchy

Powiązane problemy