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
如何在Kotlin中定义一组具有严格关系的类对_Kotlin - Fatal编程技术网

如何在Kotlin中定义一组具有严格关系的类对

如何在Kotlin中定义一组具有严格关系的类对,kotlin,Kotlin,我不熟悉Kotlin,并试图“抓住”它 我给自己做了一个练习,我希望定义一组相关的类对,但有以下限制 以下伪代码说明了我想要的设计:- 我想声明一个函数,它接受一个输入并生成一个输出,如下所示 fun process(input : Input) : Output 我将声明通用接口,如下所示:- interface Input<I> { val input: I } interface Output<O> { val output: O } 当Cus

我不熟悉Kotlin,并试图“抓住”它

我给自己做了一个练习,我希望定义一组相关的类对,但有以下限制

以下伪代码说明了我想要的设计:-

我想声明一个函数,它接受一个输入并生成一个输出,如下所示

fun process(input : Input) : Output
我将声明通用接口,如下所示:-

interface Input<I> {
    val input: I
}

interface Output<O> {
    val output: O
}
CustomInput\N
被传递到
process
函数时,它只能生成(返回)
CustomOutput\N

我如何使用Kotlin来实现这些关系?我的类的用户没有“破坏”这些规则吗


此外,是否可以强制执行
CustomInput\u 1
仅为已传递类型
CustomData\u 1
CustomOutput\u 1
仅为已传递类型
CustomData\u 2
等?

强制执行的唯一方法是将输出接口类型添加到输入接口(反之亦然)

处理这些内容的函数必须是抽象的,并且必须为每种类型的输入/输出定义具体的实现(或者使用一个uber函数,该函数充满了类型检查,而不是利用多态性,这将是混乱和难以维护的)

接口输入{
val输入:I
}
接口输出{
val输出:0
}
数据类CustomInput_1(覆盖val输入:CustomData_1):输入
数据类CustomOutput_1(覆盖val输出:CustomData_2):输出
接口处理器{
fun foo(输入:II):O
}
如果定义一个处理和输入并生成输出的单一接口,任务将简单得多:

interface Processor <in I, out O> {
    fun process(input: I): O
}
接口处理器{
乐趣过程(输入:I):O
}
然后,处理器的具体实现可以声明哪对输入/输出组合在一起:

class MyProcessor1: Processor<CustomData_1, CustomData_2> {
    override fun process(input: CustomData_1): CustomData_2 {
        return input.toCustomData2()
    }
}
类MyProcessor1:处理器{
覆盖乐趣流程(输入:CustomData_1):CustomData_2{
返回input.toCustomData2()
}
}
或者,为了强制执行有限对集,可以使用密封类而不是接口。然后,必须在同一文件中定义所有有效的输入/输出对

sealed class Processor <in I, out O> {
    abstract fun process(input: I): O
}
密封类处理器{
抽象趣味过程(输入:I):O
}

不清楚您希望在何处实施这些规则。是否要更改
CustomOutput\u X
CustomInput\u X
的声明,使
过程只能以这种方式写入?或者,您是否希望找到一种方法来声明
进程
,以便编译器了解对应关系并根据参数正确推断返回类型?“此外,是否可以强制执行
CustomInput\u 1
仅传递类型
CustomData\u 1
“这不是已经强制执行了吗?@Sweeper我想在定义每对类时强制执行这些规则,例如CustomInput\N和CustomOutput\N我喜欢使用密封类的想法,但是,我不知道如何定义CustomInput和CustomOutput类之间存在1-2-1关系的限制。在输入界面中提到输出类型感觉是错误的“任务会简单得多”之后的所有内容都是我建议的解决方案,与上面的代码无关。我认为在输入/输出包装器类中定义1-2-1限制毫无意义。它应该在建立它们之间链接的处理器中定义。
interface Processor <in I, out O> {
    fun process(input: I): O
}
class MyProcessor1: Processor<CustomData_1, CustomData_2> {
    override fun process(input: CustomData_1): CustomData_2 {
        return input.toCustomData2()
    }
}
sealed class Processor <in I, out O> {
    abstract fun process(input: I): O
}