有没有办法接受Kotlin中类型为a或B的参数?

有没有办法接受Kotlin中类型为a或B的参数?,kotlin,Kotlin,假设我有A和B: data class A(val a: String, val common: String) data class B(val b: String, val common: String) 我可以有一个方法接受其中一个并在其中使用common?比如: fun accept(val param: A|B) { println(param.common) } 继承应该可以解决这个问题 毕竟,接受这两种方法中的任何一种都意味着您不能对它们调用任何特定的方法,除非您强制转

假设我有
A
B

data class A(val a: String, val common: String)
data class B(val b: String, val common: String)
我可以有一个方法接受其中一个并在其中使用
common
?比如:

fun accept(val param: A|B) {
    println(param.common)
}

继承应该可以解决这个问题

毕竟,接受这两种方法中的任何一种都意味着您不能对它们调用任何特定的方法,除非您强制转换它们

这与在科特林接受“任何”是一样的

一个解决方法是定义两个方法,其中一个方法可以在强制转换后调用另一个方法

或者您让类继承,但您使用的是数据类,因此我假设您已经知道使用它们不容易做到这一点


数据类继承的一个解决方法是

如果让它们都实现一个公共接口,并将该接口用作参数类型,则可以这样做:

接口是公共的{
val公共:字符串
}
数据类A(val A:String,override val common:String):HasCommon
数据类B(值B:String,覆盖值common:String):HasCommon
趣味接受(参数:HasCommon){
println(参数公共)
}
主要内容(){
接受(A(“A”、“A”))
接受(B(“B”、“B”))
}
输出:

a
b

或者,您可以通过为每种类型定义多个版本的
accept
,并抽象出常见的功能,以更具功能性的方式来实现这一点:

data class A(val a: String, val common: String)
data class B(val b: String, val common: String)

fun accept(a: A) = printCommon(a.common)
fun accept(b: B) = printCommon(b.common)

fun printCommon(common: String) = println(common)

fun main() {
    accept(A("a", "a"))
    accept(B("b", "b"))
}
课程的主要功能是:

密封类AorB(val公共:字符串)
A类(val A:String,common:String):AorB(common)
B类(val B:字符串,common:字符串):AorB(common)
乐趣接受(参数:AorB){
println(参数公共)
何时(参数){
是->打印项次(参数A)
is B->println(参数B)
}
}
主要内容(){
接受(A(“A值”、“普通值”))
接受(B(“B值”、“普通值”))
}

但不使用数据类。啊,实际上,如果您将属性
打开,您可以使用数据类执行此操作:
密封类AorB(open val common:String)
+1对于密封类。有没有一种方法可以做到这一点而不使它们都继承类?如果我正确理解您的问题-没有。通过Adam建议的接口或密封类继承是
a | B
work@orirab您可以使用函数重载以不同的方式执行此操作,从而避免继承。更新了我的答案。阐明一点:你不能只使用
common
的原因是
A
common
B
common
无关。这两个属性可能拼写相同,但这并不重要;在科特林,它们完全不同,因为它们之间没有继承关系。所有答案都以各种方式提供了这种关系。这是可行的,但将参数称为
common
纯粹是装饰性的。假设您正在讨论第二个示例,那么它们没有更多的共同点,即
a
b
。第一个是由接口强制执行的。虽然我想我现在更喜欢第二个。您可以通过使它们成为扩展函数来实现它:
fun A.printcomon()=printcomon(common)