2017-05-10 8 views
8

mam trzeci biblioteki strona Java z klasy jakKotlin interfejs klasy Java: przypadkowe nadpisanie

public class ThirdParty { 
    public String getX() { 
     return null; 
    } 
} 

Mam też interfejs w Kotlin jak

interface XProvider { 
    val x: String? 
} 

Teraz chcę przedłużyć ThirdParty klasyfikuj i implementuj interfejs XProvider. Zostało to działa dobrze w moim legacy kodu Java:

public class JavaChild extends ThirdParty implements XProvider {} 

Jednak chciałbym napisać jak najwięcej jak to możliwe, Kotlin i próbuję przekonwertować moje klasy java do Kotlin. Niestety, dodaje nie działa:

class KotlinChild: ThirdParty(), XProvider 

Błąd jest

class 'KotlinChild1' must be declared abstract or implement abstract member public abstract val x: String? defined in XProvider 

Jednakże, jeśli robię coś

class KotlinChild1: ThirdParty(), XProvider { 
    override val x: String? = null 
} 

uzyskać

error: accidental override: The following declarations have the same JVM signature (getX()Ljava/lang/String;) 
    fun <get-x>(): String? 
    fun getX(): String! 
     override val x: String? = null 

Co działa to następujące brzydkie obejście:

class KotlinChild: JavaChild() 
+0

Jaki błąd otrzymasz? – marstran

+0

Przepraszam, zapomniałem. Zaktualizowałem pytanie: – dpoetzsch

+0

Możliwy duplikat [Błędy rozstrzygania przypadkowych błędów w Kotlin] (http://stackoverflow.com/questions/32970923/resolving-accidental-override-errors-in-kotlin) – mfulton26

Odpowiedz

2

Występuje konflikt nazwy między interfejsem XProvider a klasą ThirdParty (abstrakt). Spowodowane jest to mój się compililer Kotlin który kompiluje

val x: String? 

do ważnej metody Java ponieważ Java nie obsługuje dziedziczenia zmiennych lub właściwości. Prawidłowa metoda Java będzie miała nazwę "getX()". Występuje konflikt między metodą XProvider.getX() i ThirdParty.getX(). Rozwiązaniem może być zmiana nazwy własności "x" w klasie XProvider. Lub możesz utworzyć drugą klasę, która zawiera instancję ThridParty i implementuje XProvider. Kiedy wywołujemy wartość val x: String, możesz dostarczyć zawartość, pobierając ją z instancji ThirdParty.

Przykład:

class ThirdPartyImpl: XProvider { 
    private val thridPartyInstance = ThridParty() 
    override val x: String? = thirdPartyInstance.x 
} 
+1

Rozumiem problem i widzę jego obejście. Mam wiele podklas "ThirdParty" (w moim przypadku 'ParseObject') w java, które próbuję teraz przekonwertować do kotlin i właśnie tam wystąpił problem. Twoje rozwiązanie nie tylko oznaczałoby zmianę dużej ilości kodu, ale także zmieniłoby interfejs zewnętrzny ('XProperty') mojej biblioteki. – dpoetzsch

+0

Co jest o drugim rozwiązaniu? –

+0

To podejście opakowujące oznaczałoby, że będę musiał owijać wszystkie publiczne metody, których używam w moim projekcie wewnętrznie, co moim zdaniem jest również dość brzydkie. – dpoetzsch