Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 您能否从抽象类继承方法并将其泛型类型更改为特定类型?_Generics_Inheritance_Kotlin - Fatal编程技术网

Generics 您能否从抽象类继承方法并将其泛型类型更改为特定类型?

Generics 您能否从抽象类继承方法并将其泛型类型更改为特定类型?,generics,inheritance,kotlin,Generics,Inheritance,Kotlin,例如,我希望从基类继承一个函数,并希望其参数与某个基于继承的类而更改的类相匹配 基类 abstract class BaseList { abstract fun <T : BaseItem> addItem(item: T) } 注意超市的商品 我不确定泛型是这里最好的方法;它应该实现一个接口吗?是否有其他方法可以实现这一点,例如基于类实现函数的参数 明确地说,上面的代码是有效的,但在我看来这是一个糟糕的做法。如果我错误地向函数传递了我想要的类型以外的另一个类型,该类型也

例如,我希望从基类继承一个函数,并希望其参数与某个基于继承的类而更改的类相匹配

基类

abstract class BaseList {
    abstract fun <T : BaseItem> addItem(item: T)
}
注意超市的
商品

我不确定泛型是这里最好的方法;它应该实现一个接口吗?是否有其他方法可以实现这一点,例如基于类实现函数的参数


明确地说,上面的代码是有效的,但在我看来这是一个糟糕的做法。如果我错误地向函数传递了我想要的类型以外的另一个类型,该类型也是BaseItem的子类型,因此被接受,会发生什么情况?

看起来您想要的是“自我类型”。不幸的是,这在Kotlin中不可用。(到目前为止,一直在添加它们。)

本文讨论了一些解决方法

特别是,您可以通过参数化基类,使用该参数类型作为函数的参数类型,然后在子类中提供(或进一步限制)该类型来解决它。这有点尴尬(特别是,使用基类时也需要提供参数),但可能有用


另一个常见的建议是用扩展函数替换您的成员函数。

看起来您想要的是“自我类型”。不幸的是,这在Kotlin中不可用。(到目前为止,一直在添加它们。)

本文讨论了一些解决方法

特别是,您可以通过参数化基类,使用该参数类型作为函数的参数类型,然后在子类中提供(或进一步限制)该类型来解决它。这有点尴尬(特别是,使用基类时也需要提供参数),但可能有用

另一个常见的建议是用扩展函数替换成员函数

class SupermarketList : BaseList() {
    override fun <T : BaseItem> addItem(item: T) {
    }
}
class SupermarketList : BaseList() {
    override fun <T : SupermarketItem> addItem(item: T) {
    }
}