仅在Kotlin中推断一些类型参数

时间:2017-09-25 09:32:16

标签: kotlin

我有一个带有两个类型参数的方法,其中只有一个可以从参数中推断出来,类似于(不需要评论这个演员是邪恶的,身体纯粹是为了举例)

fun <A, B> foo(x: Any, y: A.() -> B) = (x as A).y()

// at call site
foo<String, Int>("1", { toInt() })

但是,如果 BInt,编译器可以告诉A String 。更一般地说,如果它知道A,则可以推断出B

有没有办法只在呼叫网站上提供A并推断B

当然,标准的Scala方法有效:

class <A> Foo() {
    fun <B> apply(x: Any, y: A.() -> B) = ...
}

// at call site
Foo<String>().apply("1", { toInt() })

我对Kotlin是否有更直接的解决方案感兴趣。

1 个答案:

答案 0 :(得分:4)

根据this issue/proposal,我说不(尚未):

  

您好,我正在为kotlin提出两项新功能   hand:部分类型参数列表和默认类型参数:)其中   本质上允许做以下事情:

    data class Test<out T>(val value: T)

    inline fun <T: Any, reified TSub: T> Test<T>.narrow(): Test<TSub>{
        return if(value is TSub) Test(value as TSub) else throw ClassCastException("...")
    }

    fun foo() {
        val i: Any = 1
        Test(i).narrow<_, Int>() // the _ means let Kotlin infer the first type parameter
        // Today I need to repeat the obvious:
        Test(i).narrow<Any, Int>()
    } 
     

如果我们可以定义类似的东西,那就更好了。

    inline fun <default T: Any, reified TSub: T> Test<T>.narrow(): Test<TSub>{
        return if(value is TSub) Test(value as TSub) else throw ClassCastException("...")
    } 
     

然后甚至不必写_

    fun foo() {
        val i: Any = 1
        Test(i).narrow<Int>() //default type parameter, let Kotlin infer the first type parameter
    }