Generyk z Javy w Kotlinie

0

Rozważmy taki kejs:

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

    }
}
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 :)

2

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

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)
    }
}
1

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

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<*>>()
0
piotrpo napisał(a):

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

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.

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/re[...]enerics.html#star-projections
https://stackoverflow.com/que[...]en-and-any-in-kotlin-generics

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:

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0