【发布时间】:2020-12-03 19:02:29
【问题描述】:
有一个抽象类Base和一个接口BaseAction。在我的项目中,A 和 B 都实现了Base、BaseAction。
abstract class Base {
abstract fun doAction()
}
interface BaseAction {
}
class A: Base(), BaseAction {
override fun doAction() {
}
}
class B: Base(), BaseAction {
override fun doAction() {
}
}
现在我定义了一个抽象类AbstractCommand,里面有一个函数:
abstract class AbstractCommand {
abstract fun <T> getActions(): List<T> where T: Base, T: BaseAction
fun doSomething() {
// Here A and B both are Ok for me.
getActions<>()
}
}
如您所见,有两个上限:Base 和 BaseAction。在函数doSomething中,我想调用getActions,在那个List中,A类和B类都适合我。
我的问题是如何调用getActions。
编辑
是的,我可以在 AbstractCommand 类中定义 T,但如果是这样,AbstractCommand 只返回 ListA> 或 ListB>。但是 List 是预期的。
编辑
我的描述是我的错。我必须更多地解释我的问题,并解释让 A 和 B 直接扩展同一个父级是不合适的。
事实上,如上所述,我的问题更复杂。让我举个完整的例子。
abstract class Base {
abstract fun doAction()
}
interface BuyGiftAction {
abstract fun buyGift()
}
abstract class A: Base(){
abstract fun doActionA()
}
abstract class B: Base() {
abstract fun doActionB()
}
如您所见,A 和 B 都扩展了 Base 类并定义了新的抽象函数。现在 A 的孩子想要实现 BuyGiftAction 而 B 的孩子这样做。
class ChildA: A(), BuyGiftAction {
override fun doActionA() {
}
override fun doAction() {
}
override fun buyGift() {
}
}
class ChildB: B(), BuyGiftAction {
override fun doActionB() {
}
override fun doAction() {
}
override fun buyGift() {
}
}
显然,让A 和B 都扩展一个名为Parent 的类是非常不合适的,该类扩展Base 并实现BuyGiftAction。
abstract class AbstractCommand {
abstract fun <T> getActionArray(): Array<T> where T: Base, T: BuyGiftAction
fun doSomething() {
// Here ChildA and ChildB both are Ok for me.
getActionArray<>()
}
}
【问题讨论】:
-
列表不是有效类型,缺少泛型类型参数。你的意思是
List<Any>? -
@WilliMentzel 列表中的项目应该扩展 Base 并实现 BaseAction。
-
但它总是只能是 List 或 List,它们是唯一扩展 Base 并实现 BaseAction 的类型。
-
@WilliMentzel 所以我很困惑,想知道是否有其他方法可以实现这一点。
-
@WilliMentzel OP 想要一个包含 As 和 B 的异构列表,除非我们指定一个共同的父类型,否则我不确定我们能否拥有它。