Дженерики с внутренними классами в котлине - PullRequest
0 голосов
/ 26 января 2019

У меня есть запечатанный класс, который содержит несколько классов данных, как показано ниже.Есть ли способ узнать, с каким классом (D1, D2, D3) я работаю в T1.printclassname ()?

sealed class A {
  data class D1 { }
  data class D2 { }
  data class D3 { }
}
class T1 {
    fun <E : A> printclassname(val c: E) {

    }
}

И попробовать то же самое с внутренними классами

internal class B {
  inner class X1 { }
  inner class X2 { }
  inner class X3 { }
}
class T2 {
    fun <E : B> printclassname(val c: E) {
      if (c is B.X1){
         // some op.
        }
    }
}

Printclassname () должен принимать любой объект D1, D2, D3.и printclassname1 должен принимать любой объект X1, X2, X3

1 Ответ

0 голосов
/ 26 января 2019

Вы должны наследовать классы A и B соответственно:

fun main(args: Array<String>) {
    printClassName1(A.D1("some value"))
    printClassName(B().X1())
}

sealed class A {
    // Data classes must have at least one primary constructor parameter
    data class D1(val p: String): A() { }
    data class D2(val p: String): A() { }
    data class D3(val p: String): A() { }
}

// make this class open to be able to inherit
open class B {
    inner class X1: B() { }
    inner class X2: B() { }
    inner class X3: B() { }
}
fun <E : B> printClassName(c: E) {
    println("name=${c::class.simpleName}")
}

fun <E : A> printClassName1(c: E) {
    println("name=${c::class.simpleName}")
}

Выходные данные:

name=D1
name=X1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...