gpt4 book ai didi

generics - Kotlin 接口(interface)函数可互换参数

转载 作者:行者123 更新时间:2023-12-01 23:35:59 24 4
gpt4 key购买 nike

我目前在一个接口(interface)上工作,它有一个简单的功能,所有扩展这个接口(interface)的类都应该实现。但是这些类应该可以像这样用不同的函数参数调用

interface IDoSomething<T> {

fun execute(vararg any: Any?): T // Make function arguments interchangeable

}
class DoSomethingA : IDoSomething<String> {

// This is what i want
override fun execute(int: Int, boolean: Boolean): String {
println("Do something with parameters: $int, $boolean")
...
}

// This is what i need to do
override fun execute(vararg any: Any?): String {
val int = any[0] as Int
val boolean = any[1] as Boolean
println("Do something with parameters: $int, $boolean")
...
}
}

实现此接口(interface)的其他类应该可以有其他参数

class DoSomethingB : IDoSomething<String> {

// Should also be possible with same interface
override fun execute(string: String, double: Double, boolean: Boolean): String {
println("Do something with parameters: $string, $double, $boolean")
...
}

}

Kotlin 中有什么可以帮助我做这样的事情吗?或者存在一种有助于解决此类问题的模式。

最佳答案

语言中没有内置任何东西来实现您想要的(例如 C++ 可变参数模板)。

但是您仍然可以使用通用输入并用包装它们的类替换多个参数来实现您想要的:

interface IDoSomething<I, T> {

fun execute(input: I): T
}

class DoSomethingB : IDoSomething<Pair<String, Double>, String> {

// Should also be possible with same interface
override fun execute(input: Pair<String, Double>): String {
val (string, double) = input
println("Do something with parameters: $string, $double")
...
}
}

这是对您的问题最简单的解决方案。

你有另一个更复杂的解决方案。

你可以有一个注解(例如@Input),它接受你需要为每个实现支持的类型,然后你可以使用注解处理器生成你的接口(interface)的扩展以具有编译时安全。

例如

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
annotation class Input(
val types: Array<KClass<*>> = []
)

@Input(types = [String::class, Double::class])
class DoSomethingB : IDoSomething<String> {

override fun execute(vararg any: Any?): String = execute(any) { string, double ->
println("Do something with parameters: $string, $double")
...
}
}

// With an annotation processor you can generate an extension like this.
fun DoSomethingB.execute(vararg input: Any?, block: (string: String, double: Double) -> String): String {
val string = input[0] as String
val double = input[1] as Double
return block(string, double)
}

关于generics - Kotlin 接口(interface)函数可互换参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60927539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com