2

在 kotlin coroutines 实验室示例中, https: //codelabs.developers.google.com/codelabs/kotlin-coroutines/#6

它通过传递MainViewModel.FACTORY(repository)

val viewModel = ViewModelProviders
    .of(this, MainViewModel.FACTORY(repository))
    .get(MainViewModel::class.java)

MainViewModel 如下,不明白里面::MainViewModel用了什么语法

val FACTORY = singleArgViewModelFactory(::MainViewModel)

singleArgViewModelFactoryhas 构造函数:

singleArgViewModelFactory(constructor: (A) -> T)

哪个取一个函数(A) -> T,里面的那个是什么::MainViewModel意思 singleArgViewModelFactory(::MainViewModel)

class MainViewModel(private val repository: TitleRepository) : ViewModel() {

    companion object {
        /**
         * Factory for creating [MainViewModel]
         *
         * @param arg the repository to pass to [MainViewModel]
         */
        val FACTORY = singleArgViewModelFactory(::MainViewModel)
    }


    ......
}



fun <T : ViewModel, A> singleArgViewModelFactory(constructor: (A) -> T):
        (A) -> ViewModelProvider.NewInstanceFactory {
    return { arg: A ->
        object : ViewModelProvider.NewInstanceFactory() {
            @Suppress("UNCHECKED_CAST")
            override fun <V : ViewModel> create(modelClass: Class<V>): V {
                return constructor(arg) as V
            }
        }
    }
}
4

1 回答 1

3

::MainViewModel是一个函数引用。对于类型参数,(A) -> T它基本上是对接受类型参数A并传递T(在这种情况下是MainViewModel自身)的函数(在这种情况下为构造函数)的引用。

将参考文献与其实际对应物进行比较:

val ref : (A) -> T = ::MainViewModel
val ref : (A) -> T = { MainViewModel(it) } // or: = { anA : A -> MainViewModel(anA) }
于 2019-05-15T14:12:36.333 回答