Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用默认值推断类类型的参数_Android_Kotlin_Kotlin Generics - Fatal编程技术网

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

Android 使用默认值推断类类型的参数,android,kotlin,kotlin-generics,Android,Kotlin,Kotlin Generics,我有一个类,其构造函数声明如下 class Facade<T : SuperClass>( val kClass: KClass<in T> = SuperClass::class ) 但由于默认值是超类,所以kotlin应该能够将参数T推断为超类。我怎么想的不对 多谢各位 TL;医生: Facade(SubClass:class) // working Facade(SuperClass:class) // working, but don't want (s

我有一个类,其构造函数声明如下

class Facade<T : SuperClass>(
    val kClass: KClass<in T> = SuperClass::class
)
但由于默认值是超类,所以kotlin应该能够将参数T推断为超类。我怎么想的不对

多谢各位

TL;医生:

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(子类:class)//工作
Facade(超类:class)//正在工作,但不想要(默认为超类)
Facade()//工作正常,但不需要尖括号
Facade()//不工作,无法从默认值推断T类型,为什么?
要使
Facade()
等效于
Facade(DerivedClass::class)
默认构造函数参数必须声明为
val kClass:kClass=T::class
。但是,要使用
T::class
T
类型参数需要为。类型参数只能在内联函数中具体化,不能在构造函数中具体化

要解决此问题,您可以声明一个委托给构造函数的工厂函数,如下所示:

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

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

您可以通过删除尖括号和更改构造函数类型来解决问题。 只需使用此构造函数:

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

哦,接得好。我的错误是,我没有指定它,但我确实需要属性和in方法的t。而且,我不能确定超类的上界(只有超类及其派生类可以进入这个构造函数)。
val derivedFacade:Facade<DerivedClass> = Facade()
fun SuperFacade(): Facade<SuperClass> = Facade()
class Facade(val kClass: KClass<*> = SuperClass::class)
Facade(SubClass:class)
Facade(SuperClass:class)
Facade()