Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics kotlin中具有内部类的泛型_Generics_Kotlin - Fatal编程技术网

Generics kotlin中具有内部类的泛型

Generics kotlin中具有内部类的泛型,generics,kotlin,Generics,Kotlin,我有一个密封的类,其中包含一些数据类,如下所示。有没有办法知道我在T1.printclassname()中使用的是哪个类(D1、D2、D3) 密封A类{ 数据类D1{} 数据类D2{} 数据类D3{} } T1类{ 趣味打印类名(val c:E){ } } 在内部类中尝试同样的方法 internal class B { inner class X1 { } inner class X2 { } inner class X3 { } } class T2 { fun <

我有一个密封的类,其中包含一些数据类,如下所示。有没有办法知道我在T1.printclassname()中使用的是哪个类(D1、D2、D3)

密封A类{
数据类D1{}
数据类D2{}
数据类D3{}
}
T1类{
趣味打印类名(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.
        }
    }
}
内部B类{
内部类X1{}
内部类X2{}
内部类X3{}
}
T2类{
趣味打印类名(val c:E){
如果(c是B.X1){
//一些op。
}
}
}

printclassname()应该接受D1、D2、D3的任何对象。和printclassname1应接受X1、X2、X3的任何对象。您应分别继承类
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}")
}

谢谢你的帮助@Sergey。当我尝试下面这样的东西时,我得到了一个不可数的错误。如果printClassName()中的(c是B.X1),则所有文件都应编译。你在哪一行和哪一种方法上有错误?更新了帖子。if语句抛出错误。确切的错误是imcomptable类型B.X1和Ejust使用我的代码,它将工作。您需要继承
B
class。您所说的“通过泛型访问那些内部类”是什么意思?只是知道他们的名字?请specify@WilliMentzel谢谢你的回复。通过访问,我的意思是我想处理各自的对象。根据我处理的数据类的不同,流程也会有所不同。Sergey的代码怎么了?
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