Wątek przeniesiony 2024-01-02 00:54 z Inne języki programowania przez somekind.

Jak nadać odpowiedni typ generyczny w zadaniu?

0

Mam następujący kod:

???? trzeba zastąpić poprawnymi typami. Ćwiczenie znalazłem w materiałach JetBrains, więc zakładam że da się je zrobić zamieniając tylko ????. Pytanie jak to rozwiązać?

open class A
class B : A()
class C : A() { fun consume(other: A): C = this }

fun <T, S : R, R> funny(
   source: Iterator<????>,
   target: MutableCollection<????>,
   base: ????,
   how: ????
) {
   var result: R = base
   for (value in source) {
       result = how(result, value)
       target.add(result)
   }
}

fun main() {
   val wtf = mutableListOf<A>()
   val src = mapOf(3.14 to B(), 2 to B(), "Hello" to B())
   val c = C()
   funny(src.values.iterator(), wtf, c) { r, t -> r.consume(t) }
}
2

Moim zdaniem nie da się tego zrobić zmieniając tylko ????.
W wersji bez generyków funkcja może wyglądać tak.
Ale ograniczenia typów kompletnie do tego nie pasują. (S:R bez sensu IMO, brak where R:T)

fun unfunny(
   source: Iterator<B>,
   target: MutableCollection<A>,
   base: C,
   how: (C, B)->C
) {
   var result: C = base
   for (value in source) {
       result = how(result, value)
       target.add(result)
   }
}

Aczkolwiek nie poświęciłem dużo czasu, więc może jest zaskakujące rozwiązanie, którego nie widzę.

1

Rozwiązanie:

fun <T, S : R, R> funny(
    source: Iterator<T>,
    target: MutableCollection<in R>,
    base: S,
    how: (R, T) -> R
)

https://discuss.kotlinlang.org/t/exercise-about-generics-from-kotlin-education-presentation/27885/7?u=heci_pan

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