gpt4 book ai didi

android - 使用默认值推断类类型的参数

转载 作者:太空狗 更新时间:2023-10-29 14:40:46 24 4
gpt4 key购买 nike

我有一个类的构造函数是这样声明的

class Facade<T : SuperClass>(
val kClass: KClass<in T> = SuperClass::class
)

这样做是为了让开发人员在想要使用它而不是子类时不必指定 SuperClass。发送类类型的原因是,开发人员不必在尖括号中指定类型。

但是现在问题来了。像下面这样创建实例表示没有足够的信息来推断参数 T。这导致必须将类放在尖括号中。

Facade()

但由于默认值为 SuperClass,因此 kotlin 应该能够将参数 T 推断为 SuperClass。我在想什么?

谢谢

长话短说:

Facade(SubClass:class) // working
Facade(SuperClass:class) // working, but don't want (superclass is default)
Facade<SuperClass>() // working, but don't want angle brackets <>
Facade() // not working, cannot infer T type from default, why?

最佳答案

对于 Facade()相当于Facade(DerivedClass::class)默认构造函数参数必须声明为 val kClass: KClass<in T> = T::class .但是要使用 T::class T类型参数需要是 reified .类型参数只能在内联函数中具体化,而不能在构造函数中具体化。

要解决此问题,您可以像这样声明一个委托(delegate)给构造函数的工厂函数:

inline fun <reified T : SuperClass> Facade(): Facade<T> = Facade(T::class)

这允许人们使用它,例如:

val derivedFacade:Facade<DerivedClass> = Facade()

请注意,如果您想使用 SuperClass作为 T 的默认参数您需要使用不同的名称声明另一个工厂方法,例如:

fun SuperFacade(): Facade<SuperClass> = Facade()

这是必需的,因为如果我们声明了 @JvmName("SuperFacade") fun Facade() = Facade(SuperClass::class)只要我们不提供类型参数,编译就会匹配它。这反过来会违背 derivedFacade 的类型推断。示例。

关于android - 使用默认值推断类类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48643622/

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