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_Interface - Fatal编程技术网

Generics Kotlin中的一般约束,这仅仅是一个方差问题吗?

Generics Kotlin中的一般约束,这仅仅是一个方差问题吗?,generics,kotlin,interface,Generics,Kotlin,Interface,我在用Kotlin编写的项目中创建一些抽象方面有点问题。假设我有一个接口 interface IInterface<A : Any, B> where B : IInterface<A, B> { fun doSomething(someData: A): B } 接口接口,其中B:i接口{ 有趣的事(一些数据:A):B } 我关心的是类型B实现了IIinterface,并由该接口的doSomething函数返回。第一个明显的选择是提供B作为通用参数 我想要实

我在用Kotlin编写的项目中创建一些抽象方面有点问题。假设我有一个接口

interface IInterface<A : Any, B> where B : IInterface<A, B> {
    fun doSomething(someData: A): B
}
接口接口,其中B:i接口{
有趣的事(一些数据:A):B
}
我关心的是类型B实现了IIinterface,并由该接口的doSomething函数返回。第一个明显的选择是提供B作为通用参数

我想要实现的是这样的目标:

class MyClass<A : Any, B>(val value: String) : IInterface<A, B> where B : MyClass<A, B> {
    override fun doSomething(someData: A): B = MyClass(someData.toString())
}
class MyClass(val值:String):界面,其中B:MyClass{
重写fun doSomething(someData:A):B=MyClass(someData.toString())
}
其中,重写函数返回一个类型为的对象,该对象被约束为类本身的类型

不幸的是,出于某种原因,编译器抱怨被重写函数的返回值不是B而是MyClass,即使我将B更正为MyClass类型。 我错过什么了吗?可能有魔法吗

这可能有一个合理的理由,但我没有说。但如何处理这个问题呢

我最有可能面临的另一个问题是将在Myclass实例外部使用的构造函数

val-amyclasstance=MyClass(“a值”)


我想这可以通过Scala的方式在Arrow库的帮助下完成,但首先我想知道一个无作弊的Kotlin解决方案是否可行

这是一个已知的问题,您可以投票支持它


作为一种解决方法,您需要声明一个MyClass的继承器来替换所有类型参数。它可以解决您的问题。

您的签名意味着您的方法需要返回MyClass的特定子类,其中B类型变量标识该子类。您的方法实际返回的是MyClass的实例,而不是签名所需的特定子类。@yole不确定我是否理解正确,但在
where
子句中我指定了“where B:MyClass”。这是否意味着在此上下文中MyClass不被视为自身的子类?不,它是自身的子类,这不是问题所在。签名允许您使用MyClass的子类作为B类型参数实例化MyClass。在这种情况下,您需要一个方法来返回MyClass的子类,但只返回MyClass。@Yele那么,既然我知道B必须从MyClass继承,为了解决我的问题,我应该只需要将B强制转换为MyClass`将fun doSomething(someData:A):B=MyClass(someData.toString())重写为B'。除非我完全弄错了……否则我想你应该改写:
classmyclass(val-value:String):IInterface{override-fun-doSomething(someData:A):MyClass=MyClass(someData.toString())}