我目前正在开发一个用 Swift 实现的 KMM 库。所以我对泛型有一些不太理解的地方。
我有我的 KMM 通用类:
class Foo<T> {
...
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以在 KMM 中毫无问题地使用它,例如像这样
var bar = Foo<List<SomeClass>>()
Run Code Online (Sandbox Code Playgroud)
当我在 swift 中使用它时,这有点不同,因为当我将 KMM 库编译为 Swift 框架时,我的类现在以这种方式声明:
public class Foo<T> : KotlinBase where T : AnyObject {
...
}
Run Code Online (Sandbox Code Playgroud)
在这里,我无法像在 KMM 中那样将它与数组一起使用,因为 Swift 数组不是 Any,而是 AnyObject。例如:
var bar = Foo<[SomeClass]>()
Run Code Online (Sandbox Code Playgroud)
然后我收到错误:
“Foo”要求“[AnyObject]”是类类型
是否可以强制执行某些操作,以便 KMM Any 在 Swift 中被解释为 Any 而不是 AnyObject,或者这个问题还有其他解决方案吗?
正如亚历山大所说:
可能没有办法解决这个问题。从根本上说,除了少数硬编码到平台中的原语之外,JVM 缺乏一种表达就地分配的值类型(如 Swift 的结构或枚举)的方法。
所以我尝试在 KMM 中重载 Foo,如下所示:
class ListFoo<T>() : Foo<T>() where …Run Code Online (Sandbox Code Playgroud)