Generics 为kotlin泛型设置默认值

Generics 为kotlin泛型设置默认值,generics,kotlin,Generics,Kotlin,我有这个扩展功能: fun <T : View> Activity.bind(idRes: Int): Lazy<T> = lazy { findViewById<T>(idRes) } 很好,但现在让我们看看问题所在,有时我不需要特定类型,我只需要查看,例如,当我想设置单击侦听器时,我必须这样做: val view1 by bind<View>(R.id.view_1) val view2: View by bind(R.id.view_2)

我有这个扩展功能:

fun <T : View> Activity.bind(idRes: Int): Lazy<T> = lazy { findViewById<T>(idRes) }
很好,但现在让我们看看问题所在,有时我不需要特定类型,我只需要查看,例如,当我想设置单击侦听器时,我必须这样做:

val view1 by bind<View>(R.id.view_1)
val view2: View by bind(R.id.view_2)
我确实试过:

fun Activity.bind(idRes: Int): Lazy<View> = lazy { findViewById<View>(idRes) }

fun <T : View> Activity.bind(idRes: Int): Lazy<T> = lazy { findViewById<T>(idRes) }
什么是有意义的,因为泛型类型擦除

我想知道一个解决方案,它不涉及另一种方法,比如
fun Activity.bindView…
,因为我希望API尽可能简单


另外,
synthetic
选项有几个bug,我们之所以使用这个延迟绑定就是为了避开它。

Kotlin编译器总是会推断出最具体的泛型类型,并且没有“default”类型参数,所以您必须创建额外的函数。您可以使用
JvmName
注释来解决平台声明崩溃:

fun <T> foo(): T? = null

@JvmName("foo0")
fun foo(): Any? = null

fun main() {
    foo<Nothing>()
    foo()
}
fun foo():T?=无效的
@JvmName(“foo0”)
fun foo():有吗?=无效的
主要内容(){
foo()
foo()
}

它确实适用于绑定的用法
val TextView 1(R.id.text\u view\u 1)
但不适用于绑定的用法
val TextView 2:TextView(R.id.text\u view\u 2)
。无论如何,我认为它解决了问题,我对这个技巧印象深刻:)。绑定现在是:
@JvmName(“bindView”)fun Activity.bind(idRes:Int):Lazy=Lazy{findviewbyd(idRes)}fun Activity.bind(idRes:Int):Lazy=Lazy{findviewbyd(idRes)}
fun Activity.bind(idRes: Int): Lazy<View> = lazy { findViewById<View>(idRes) }

fun <T : View> Activity.bind(idRes: Int): Lazy<T> = lazy { findViewById<T>(idRes) }
Platform declaration clash: The following declarations have the same JVM signature
fun <T> foo(): T? = null

@JvmName("foo0")
fun foo(): Any? = null

fun main() {
    foo<Nothing>()
    foo()
}