Generics 无法自动推断类型后,在运行时选择重载函数

Generics 无法自动推断类型后,在运行时选择重载函数,generics,kotlin,overloading,Generics,Kotlin,Overloading,我有一个函数调用重载函数funcA。假设我们有不同类型的A、B和C,它们都实现了抽象类Top。现在,对于泛型类型funcA(p0:Top)以及其他给定类型funcA(p0:A),funcA(p0:B)等,该给定函数funcA存在 现在,当我只得到一个通用变量时,我想调用该函数it:Top。如果我现在只写funcA(it),Kotlin无法自动推断要调用哪个重载函数,因为确切的类型现在已被删除 工作原理是在调用funcA之前检查给定类型并强制转换它们: when(it) { is A -&

我有一个函数调用重载函数
funcA
。假设我们有不同类型的
A
B
C
,它们都实现了抽象类
Top
。现在,对于泛型类型
funcA(p0:Top)
以及其他给定类型
funcA(p0:A)
funcA(p0:B)
等,该给定函数
funcA
存在

现在,当我只得到一个通用变量时,我想调用该函数
it:Top
。如果我现在只写
funcA(it)
,Kotlin无法自动推断要调用哪个重载函数,因为确切的类型现在已被删除

工作原理是在调用
funcA
之前检查给定类型并强制转换它们:

when(it) {
    is A -> funcA(it)
    is B -> funcA(it)
    is C -> funcA(it)
    else -> error("Cannot infer correctly")
}

有什么办法可以更好地解决这个问题吗?

你能把
funcA
作为你的
Top
类的抽象方法吗?这通常是最好的方法,因为通常的动态方法调度将在运行时处理所有问题。(如本文所示,当涉及泛型时,类型擦除使得静态执行该操作非常困难。)在这种情况下,
funcA
方法来自Java库(),因此我不能做太多更改。您能将
funcA
作为
Top
类的抽象方法吗?这通常是最好的方法,因为通常的动态方法调度将在运行时处理所有问题。(如本文所示,当涉及泛型时,类型擦除使得静态执行该操作非常困难。)在本例中,
funcA
方法来自Java库(),因此我不能做太多更改。