Generyk z Javy w Kotlinie

Generyk z Javy w Kotlinie
W9
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 3 lata
  • Postów:132
0

Rozważmy taki kejs:

Kopiuj
public class MainClass extends BaseMainClass<IMainClassContract.Two> {
}
Kopiuj
public abstract class BaseMainClass<T extends IBaseMainClassContract.Two> {
}
Kopiuj
public interface IMainClassContract {
    interface Two extends IBaseMainClassContract.Two{

    }
}
Kopiuj
public interface IBaseMainClassContract {
    interface Two<V> {
        void something(V something);
    }
}

**BaseMainClass **przyjmuje tylko typ typu IBaseMainClassContract.Two

Jak będzie wyglądało takie generyczne zabezpieczenie w Kotlinie ?
Dokumentacja na temat generyków w kotlinie jest dla mnie mało czytelna, a konwersji kodu nie ufam :)

superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Kraków
  • Postów:2000
2

Z grubsza (bardzo z grubsza) tak - skompilować się skompiluje, ale czy to o to chodziło... ¯\_(ツ)_/¯

Kopiuj
abstract class BaseMainClass<V, T: IBaseMainClassContract.Two<V>> {
}

class MainClass<V, T: IMainClassContract.Two<V>>: BaseMainClass<V, T>() {
}

interface IMainClassContract {
    interface Two<V>: IBaseMainClassContract.Two<V>{

    }
}

interface IBaseMainClassContract {
    interface Two<V> {
        fun something(arg: V)
    }
}

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:15 dni
  • Postów:3277
1

Trochę się gubię w tej hierarchii klas, ale coś na ten kształt powinno zadziałać:

Kopiuj
interface IBaseMainClassContract {
    interface Two<in V> {
        fun something(something: V)
    }
}

interface IMainClassContract {
    interface Two<in T> : IBaseMainClassContract.Two<T>
}

abstract class BaseMainClass<in T : IBaseMainClassContract.Two<*>>

class MainClass : BaseMainClass<IMainClassContract.Two<*>>()
W9
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 3 lata
  • Postów:132
0
piotrpo napisał(a):

Trochę się gubię w tej hierarchii klas, ale coś na ten kształt powinno zadziałać:

Kopiuj
class MainClass : BaseMainClass<IMainClassContract.Two<*>>()

Jesteś w stanie wytłumaczyć o co chodzi z tą gwiazdką ?
Na pierwszy rzut oka wygląda jakby można tam było wsadzić dowolną wartość, ale to raczej nie ma sensu.

superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:Kraków
  • Postów:2000
1
wioletta90 napisał(a):

Jesteś w stanie wytłumaczyć o co chodzi z tą gwiazdką ?
Na pierwszy rzut oka wygląda jakby można tam było wsadzić dowolną wartość, ale to raczej nie ma sensu.

http://kotlinlang.org/docs/reference/generics.html#star-projections
https://stackoverflow.com/questions/40138923/difference-between-and-any-in-kotlin-generics


W9
zazdroszczę inteligencji, jeżeli rozumiesz coś z tej dokumentacji :)
superdurszlak
no właśnie nie byłem tego w stanie sam zbyt dokładnie opisać, bo ze star raczej nie korzystamy w projekcie :D więc i tak te docsy są bardziej zrozumiałe od tego, co bym wypocił, że mi się zdaje
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:15 dni
  • Postów:3277
1

Gwiazdka, jak słusznie zauważyłaś oznacza dowolną klasę.

Kotlin nie ma odpowiedników Javowych <? extends String>, czy <? super ArrayList>
Dla odmiany coś takiego jest poprawnym kodem:

Kopiuj
open class Consumer<T>{
    fun consume(input: T){}
}

class ListConsumer: Consumer<List<CharSequence>>(){
    fun doSomething(){
        val list = ArrayList<String>()
        consume(list)
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.