我有一个密封的类,其中包含一些数据类,如下所示。是否有办法知道我在T1.printclassname()中使用哪个类(D1,D2,D3)?
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的任何对象
答案 0 :(得分:1)
您应该分别继承类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