【问题标题】:How to call function from generic function without knowing the type?如何在不知道类型的情况下从泛型函数调用函数?
【发布时间】:2020-11-06 18:00:03
【问题描述】:

有没有办法做到以下几点?:


class Someotherthing
class SomeotherthingDTO

class Something
class SomethingDTO

fun convert(entity: Someotherthing): SomeotherthingDTO = SomeotherthingDTO()
fun convert(entity: Something): SomethingDTO = SomethingDTO()

fun <T, D> generic(entity: T): D {
    // TODO: check here if there is convert() that accepts type T?! somehow? reflection? reification? or it will be possible only in the future by using typeclasses (KEEP-87)?
    return convert(entity)
}

fun main() {
    val x: SomethingDTO = convert(Something())
    println(x.toString())
}

目前,结果是:不能使用提供的参数调用以下任何一个...

【问题讨论】:

  • 不可能像您描述的那样自动执行此操作。即使使用具体类型,您也必须使用 when 语句来检查类型并手动选择适当的函数。
  • 谢谢。我是这么想的。你会看到一个可能的解决方法吗?使用完全不同的东西?我只是想在类本身之外实现一些方法。包括一些接口会起作用,但是我需要在类中实现接口,而不是在外面。你看有没有别的办法?还是只有 KEEP-87(类型类)才能做到这一点?
  • 扩展功能是否符合您的需求?
  • 他们会,如果我可以定义一个不依赖于接口的通用函数,但更像是“这个扩展函数是为那个类型定义的吗?” (因为你不能用接口标记类(你在上面的通用函数中需要它)并在扩展函数中实现该接口......)
  • Haskell 可以通过类型类做到这一点,但有趣的是,其他一些编译的强类型静态语言可以做到这一点。 Crystal 可以做到——不问任何问题,Nim 也可以做到——不问任何问题。可惜 Kotlin 不能以任何方式做到这一点......

标签: kotlin generics functional-programming


【解决方案1】:

您需要多个接收器才能正常工作 (KEEP-87)。有了这些,您将能够正确“找到”接收器。

在此之前我通常做的是将Converters 放入ConverterRegistry 中进行这样的转换:

interface Converter<A, B> {
    val fromClass: KClass<A>
    val toClass: KClass<B>

    fun convert(from: A): B

    fun convertBack(from: B): A
}

interface ConverterRegistry {
    fun <A, B> tryConvert(from: KClass<A>, to: KClass<B>): B?
}

【讨论】:

  • 感谢您的回答。这绝对是解决它的一种方法。但是然后我需要为所有不同的东西拥有所有这些注册表......并管理对它的注册......这不是很优雅。 Spring 的 autowire 也可以自动执行这种泛型类型,例如val service: Converter&lt;Something, SomethingDTO&gt; 将自动连接 @Component 与这些类型自动实现。但我不想为此使用类,因为这些将无法访问 this - 对原始实体。 (例如,从另一个转换器调用一个转换器需要访问注册表。)
  • 这是多个接收器将解决的问题(等等)。现在我无法想象一个更简单/更好的解决方案来解决您的问题。
  • 我会将其标记为答案 - 因为您是对的,目前不存在更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多